Проверка полезной нагрузки REST JSON-B
Я разработал службу Java REST с использованием JSON-B для сопоставления входящей полезной нагрузки с POJO.
Теперь я хотел бы проверить входящую полезную нагрузку, возможно, по схеме JSON, но я пока не смог ничего найти в этом смысле...
Можно ли переопределить процесс отображения JSON-B по умолчанию, следовательно, перехватить любое исключение отображения и обработать его самостоятельно?
0 ответов
Для этого вы можете зарегистрировать своего собственного провайдера JAX-RS, который выполняет сериализацию JSON (de) и обрабатывает там любые ошибки.
Например:
@Consumes({ "*/*" })
@Provider
public class JsonBProvider implements MessageBodyReader<Object> {
private static final Jsonb jsonb = JsonbBuilder.create();
@Override
public boolean isReadable(Class<?> type, Type genericType,
Annotation[] annotations,
MediaType mediaType) {
return true;
}
@Override
public Object readFrom(Class<Object> clazz, Type genericType, Annotation[] annotations,
MediaType mediaType, MultivaluedMap<String, String> httpHeaders,
InputStream entityStream)
throws IOException, WebApplicationException {
try {
return this.jsonb.fromJson(entityStream, clazz);
} catch (Exception e) {
// Do your custom handling here
}
}
}
Это переопределит десериализацию, которая происходит через JAX-RS и JSON-B.
ПРИМЕЧАНИЕ: если вы хотите сделать то же самое для сериализации, вы можете реализовать MessageBodyWriter<Object>
аналогичным образом.
Если вы действительно придерживаетесь схемы JSON, проверка документа JSON при его десериализации может быть достигнута с помощью Justify. Существует пример привязки, который показывает, как использовать валидатор JSON с JSON-B. Надеюсь, пример кода может вам помочь.
Полное раскрытие информации: я являюсь автором библиотеки.
Проверка и десериализация - это разные задачи, поэтому я бы связал их вместе, только если мне это действительно нужно, например, если вы действительно должны использовать схемы JSON. Но если вы можете выбрать свой собственный способ объявления ограничений, я рекомендую валидацию bean-компонентов, например, ресурс JAX-RS, подобный этому (обратите внимание на@Valid
аннотация):
@Path("ping")
public class PingBoundary {
@POST
public String ping(@NotNull @Valid Person addressee) {
return "Hi " + addressee.getName() + "!";
}
}
И такой класс полезной нагрузки (с использованием аннотации lombok @Data):
@Data
public class Person {
private String name;
@Min(0)
private short age;
}
Передача недействительного age
-2 дает вам 400 Bad Request
с полезным телом ответа:
{
"classViolations": [],
"exception": null,
"fieldViolations": [],
"parameterViolations": [
{
"constraintType": "PARAMETER",
"message": "must be greater than or equal to 0",
"path": "ping.addressee.age",
"value": "-2"
}
],
"propertyViolations": [],
"returnValueViolations": []
}
Обратите внимание, что вы должны пройти -parameters
компилятору или path
было бы ping.arg0.age
.