Проверка полезной нагрузки REST JSON-B - PullRequest
0 голосов
/ 29 апреля 2018

Я разработал службу Java REST с использованием JSON-B для сопоставления входящей полезной нагрузки с POJO.

Теперь я хотел бы проверить входящую полезную нагрузку, возможно, по схеме JSON, но я пока не смог ничего найти в этом смысле ...

Можно ли переопределить процесс отображения JSON-B по умолчанию, следовательно, перехватить любое исключение отображения и обработать его самостоятельно?

Ответы [ 3 ]

0 голосов
/ 16 июня 2019

Проверка и десериализация - это отдельные задачи, поэтому я бы связал их вместе, только если мне это действительно нужно, например, если вы действительно должны использовать схемы JSON. Но если вы можете выбрать свой собственный способ объявления ограничений, я рекомендую проверку бина, например, ресурс 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.

0 голосов
/ 18 июня 2019

Если вы действительно придерживаетесь схемы JSON, проверка документа JSON при десериализации может быть достигнута с помощью Justify . Существует пример Binding , который показывает, как использовать валидатор JSON с JSON-B. Я надеюсь, что пример кода может помочь вам.

Полное раскрытие: я автор библиотеки.

0 голосов
/ 11 декабря 2018

Для этого вы можете зарегистрировать своего собственного провайдера 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> аналогичным образом.

...