Проверка полезной нагрузки 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.

Другие вопросы по тегам