Deserializer: BadRequestAlertException("Unknown property") with test code coverage
This commit is contained in:
parent
60612f6c41
commit
f9b68df901
@ -163,7 +163,7 @@ public abstract class JsonDeserializerWithAccessFilter<T extends AccessMappings>
|
|||||||
jsonFieldReader(node, field).readInto(dto);
|
jsonFieldReader(node, field).readInto(dto);
|
||||||
updatingFields.add(field);
|
updatingFields.add(field);
|
||||||
} catch (NoSuchFieldException e) {
|
} catch (NoSuchFieldException e) {
|
||||||
throw new RuntimeException("setting field " + fieldName + " failed", e);
|
throw new BadRequestAlertException("Unknown property", fieldName, "unknownProperty");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -137,9 +137,24 @@ public class ReflectionUtil {
|
|||||||
T get() throws Exception;
|
T get() throws Exception;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> T unchecked(final ThrowingSupplier<T> supplier) {
|
/**
|
||||||
|
* Catches checked exceptions and wraps these into an unchecked RuntimeException.
|
||||||
|
* <p>
|
||||||
|
* Rationale: Checked exceptions are a controversial Java feature to begin with.
|
||||||
|
* They often mix error handling code into the normal flow of domain rules
|
||||||
|
* or other technical aspects which is not only hard to read but also violates
|
||||||
|
* the Single Responsibility Principle. Often this is even worse for expressions
|
||||||
|
* than it is for statements.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param expression an expresion which returns a T and may throw a checked exception
|
||||||
|
* @param <T> the result type of the expression
|
||||||
|
* @return the result of the expression
|
||||||
|
* @throws RuntimeException which wraps a checked exception thrown by the expression
|
||||||
|
*/
|
||||||
|
public static <T> T unchecked(final ThrowingSupplier<T> expression) {
|
||||||
try {
|
try {
|
||||||
return supplier.get();
|
return expression.get();
|
||||||
} catch (final Exception e) {
|
} catch (final Exception e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"error": {
|
"error": {
|
||||||
"idNotFound": "Technische Datensatz-ID nicht gefunden",
|
"idNotFound": "Technische Datensatz-ID nicht gefunden",
|
||||||
|
"unknownProperty": "Unbekannte Eigenschaft",
|
||||||
"shareSubscriptionPositiveQuantity": "Zeichnungen von Geschäftsanteilen erfordern eine positive Stückzahl",
|
"shareSubscriptionPositiveQuantity": "Zeichnungen von Geschäftsanteilen erfordern eine positive Stückzahl",
|
||||||
"shareCancellationNegativeQuantity": "Kündigungen von Geschäftsanteilen erfordern eine negative Stückzahl",
|
"shareCancellationNegativeQuantity": "Kündigungen von Geschäftsanteilen erfordern eine negative Stückzahl",
|
||||||
"shareTransactionImmutable": "Transaktionen mit Geschäftsanteilen sind unveränderlich",
|
"shareTransactionImmutable": "Transaktionen mit Geschäftsanteilen sind unveränderlich",
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"error": {
|
"error": {
|
||||||
"idNotFound": "Technical record-ID not found",
|
"idNotFound": "Technical record-ID not found",
|
||||||
|
"unknownProperty": "Unknown Property",
|
||||||
"shareSubscriptionPositiveQuantity": "Share subscriptions require a positive quantity",
|
"shareSubscriptionPositiveQuantity": "Share subscriptions require a positive quantity",
|
||||||
"shareCancellationNegativeQuantity": "Share cancellations require a negative quantity",
|
"shareCancellationNegativeQuantity": "Share cancellations require a negative quantity",
|
||||||
"shareTransactionImmutable": "Share transactions are immutable",
|
"shareTransactionImmutable": "Share transactions are immutable",
|
||||||
|
@ -399,6 +399,24 @@ public class JSonDeserializationWithAccessFilterUnitTest {
|
|||||||
.hasMessageContaining("GivenDtoWithUnknownFieldType.unknown");
|
.hasMessageContaining("GivenDtoWithUnknownFieldType.unknown");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldDetectUnknownPropertyName() throws IOException {
|
||||||
|
// given
|
||||||
|
securityContext.havingAuthenticatedUser().withAuthority(AuthoritiesConstants.ADMIN);
|
||||||
|
givenJSonTree(asJSon(ImmutablePair.of("somePropWhichDoesNotExist", "Some Value")));
|
||||||
|
|
||||||
|
// when
|
||||||
|
final Throwable exception = catchThrowable(
|
||||||
|
() -> deserializerForGivenDto().deserialize(jsonParser, null));
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(exception).isInstanceOfSatisfying(BadRequestAlertException.class, (exc) -> {
|
||||||
|
assertThat(exc).hasMessageStartingWith("Unknown property");
|
||||||
|
assertThat(exc.getParam()).isEqualTo("somePropWhichDoesNotExist");
|
||||||
|
assumeThat(exc.getErrorKey()).isEqualTo("unknownProperty");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// --- only fixture code below ---
|
// --- only fixture code below ---
|
||||||
|
|
||||||
private void givenJSonTree(String givenJSon) throws IOException {
|
private void givenJSonTree(String givenJSon) throws IOException {
|
||||||
|
Loading…
Reference in New Issue
Block a user