Skip to content

Commit a3395a3

Browse files
Added better exception message for inaccessible fields
1 parent edaea13 commit a3395a3

8 files changed

Lines changed: 68 additions & 16 deletions

File tree

.run/Run Complex Demo.run.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<configuration default="false" name="Run Complex Demo" type="Application" factoryName="Application">
33
<option name="MAIN_CLASS_NAME" value="software.xdev.spring.data.eclipse.store.demo.complex.ComplexDemoApplication" />
44
<module name="spring-data-eclipse-store-demo" />
5-
<option name="VM_PARAMETERS" value="--add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.time=ALL-UNNAMED" />
5+
<option name="VM_PARAMETERS" value="--add-opens java.base/java.util=ALL-UNNAMED" />
66
<option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
77
<extension name="coverage">
88
<pattern>

spring-data-eclipse-store/pom.xml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -272,13 +272,10 @@
272272
<version>3.3.0</version>
273273
<configuration>
274274
<argLine>
275+
--add-exports java.base/jdk.internal.misc=ALL-UNNAMED
275276
--add-opens java.base/java.util=ALL-UNNAMED
276277
--add-opens java.base/java.math=ALL-UNNAMED
277278
--add-opens java.base/java.time=ALL-UNNAMED
278-
--add-opens java.base/java.time.zone=ALL-UNNAMED
279-
--add-opens java.base/java.util.concurrent=ALL-UNNAMED
280-
--add-opens java.base/sun.util.calendar=ALL-UNNAMED
281-
--add-exports java.base/jdk.internal.misc=ALL-UNNAMED
282279
</argLine>
283280
</configuration>
284281
</plugin>

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/exceptions/FieldAccessReflectionException.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,15 @@
2020

2121
public class FieldAccessReflectionException extends RuntimeException
2222
{
23-
public static final String COULD_NOT_READ_FIELD = "Could not read field %s";
23+
public static final String COULD_NOT_READ_FIELD = "Could not read field %s#%s";
24+
25+
public FieldAccessReflectionException(final Field field)
26+
{
27+
super(String.format(
28+
FieldAccessReflectionException.COULD_NOT_READ_FIELD,
29+
field.getDeclaringClass().getName(),
30+
field.getName()));
31+
}
2432

2533
public FieldAccessReflectionException(final String message, final Exception e)
2634
{
@@ -29,6 +37,9 @@ public FieldAccessReflectionException(final String message, final Exception e)
2937

3038
public FieldAccessReflectionException(final Field field, final Exception e)
3139
{
32-
this(String.format(FieldAccessReflectionException.COULD_NOT_READ_FIELD, field.getName()), e);
40+
this(String.format(
41+
FieldAccessReflectionException.COULD_NOT_READ_FIELD,
42+
field.getDeclaringClass().getName(),
43+
field.getName()), e);
3344
}
3445
}

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/EclipseStoreStorage.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,6 @@ public synchronized void stop()
333333
@SuppressWarnings("unchecked")
334334
public <T, ID> IdManager<T, ID> ensureIdManager(final Class<T> domainClass)
335335
{
336-
this.ensureEntitiesInRoot();
337336
return (IdManager<T, ID>)this.idManagers.computeIfAbsent(
338337
domainClass,
339338
clazz ->

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/access/AccessHelper.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,4 +110,17 @@ public static <T> Object readFieldVariable(final Field field, final T sourceObje
110110
throw new FieldAccessReflectionException(field, e);
111111
}
112112
}
113+
114+
public static void checkAllFieldsForReadRestrictions(final Class<?> clazz)
115+
{
116+
getInheritedPrivateFieldsByName(clazz).forEach(
117+
(fieldName, field) ->
118+
{
119+
if(!field.trySetAccessible())
120+
{
121+
throw new FieldAccessReflectionException(field);
122+
}
123+
}
124+
);
125+
}
113126
}

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/access/modifier/FieldAccessibleMaker.java

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,14 @@ public class FieldAccessibleMaker<E> implements FieldAccessModifier<E>
6161
@Override
6262
public Object getValueOfField(final E objectOfFieldToRead) throws IllegalAccessException
6363
{
64-
return this.field.get(objectOfFieldToRead);
64+
try
65+
{
66+
return this.field.get(objectOfFieldToRead);
67+
}
68+
catch(final IllegalAccessException e)
69+
{
70+
throw this.createIllegalAccessToField(this.field);
71+
}
6572
}
6673

6774
@Override
@@ -73,11 +80,36 @@ public void writeValueOfField(
7380
{
7481
if(throwExceptionIfFinal && this.isFinal)
7582
{
76-
throw new IllegalAccessException(String.format(
77-
"Field %s:%s is final and cannot be modified. Make the field not final.",
78-
objectOfFieldToWriteTo.toString(), this.field.getName()));
83+
throw new IllegalAccessException(
84+
"Field %s#%s is final and cannot be modified. Make the field not final."
85+
.formatted(
86+
this.field.getType().getName(),
87+
this.field.getName()
88+
)
89+
);
90+
}
91+
try
92+
{
93+
this.field.set(objectOfFieldToWriteTo, valueToWrite);
7994
}
80-
this.field.set(objectOfFieldToWriteTo, valueToWrite);
95+
catch(final IllegalAccessException e)
96+
{
97+
throw this.createIllegalAccessToField(this.field);
98+
}
99+
}
100+
101+
private IllegalAccessException createIllegalAccessToField(final Field field) throws IllegalAccessException
102+
{
103+
return new IllegalAccessException(
104+
("Could not access field %s#%s. Make sure that the module is open e.g. with following VM option: "
105+
+ "\"--add-opens %s/%s=ALL-UNNAMED\"")
106+
.formatted(
107+
field.getDeclaringClass().getName(),
108+
field.getName(),
109+
field.getDeclaringClass().getModule().getName(),
110+
field.getDeclaringClass().getPackageName()
111+
)
112+
);
81113
}
82114

83115
public boolean isFinal()

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/SimpleEclipseStoreRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.springframework.data.repository.query.FluentQuery;
3636

3737
import software.xdev.spring.data.eclipse.store.repository.EclipseStoreStorage;
38+
import software.xdev.spring.data.eclipse.store.repository.access.AccessHelper;
3839
import software.xdev.spring.data.eclipse.store.repository.interfaces.EclipseStoreCrudRepository;
3940
import software.xdev.spring.data.eclipse.store.repository.interfaces.EclipseStoreListCrudRepository;
4041
import software.xdev.spring.data.eclipse.store.repository.interfaces.EclipseStoreListPagingAndSortingRepositoryRepository;
@@ -86,6 +87,7 @@ public SimpleEclipseStoreRepository(
8687
this.storage.registerEntity(domainClass, this);
8788
this.copier = copier;
8889
this.transactionManager = transactionManager;
90+
AccessHelper.checkAllFieldsForReadRestrictions(domainClass);
8991
}
9092

9193
@SuppressWarnings("unchecked")

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/id/IdManager.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,7 @@ public ID getId(final T entity)
112112
}
113113
catch(final Exception e)
114114
{
115-
throw new FieldAccessReflectionException(String.format(
116-
FieldAccessReflectionException.COULD_NOT_READ_FIELD,
117-
this.ensureIdField().getName()), e);
115+
throw new FieldAccessReflectionException(this.ensureIdField(), e);
118116
}
119117
}
120118
return null;

0 commit comments

Comments
 (0)