Не удается отловить 400 неверных запросов с помощью javax.ws.rs.ext.ExceptionMapper - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть метод обслуживания REST, который использует метод POST http и принимает application/json. JSON связан с bean-компонентом JAXB:

@POST
public void test(final HierResult obj) throws Exception {
    printHierResult(obj);
}

@XmlRootElement
public static class HierResult {
    public String dummy;
}

Я заметил, что когда кто-то отправляет мне синтаксически допустимое JSON, содержащее неизвестное поле, скажем, { "aaa": "bbb" }, то ошибка не регистрируется, но сеть сервер возвращает:

HTTP/1.1 400 Bad Request
Server: WildFly/11

Unrecognized field "aaa" (class HierResult), not marked as ignorable

Итак, вопрос: как мне зарегистрировать эту ошибку?

Я зарегистрировал ExceptionMapper для java.lang.Exception, но это может только перехват JsonParseException или исключений, сгенерированных моим методом java, а не ошибка выше.

@Provider
public class MyExceptionLogger implements ExceptionMapper<Exception> {
    private static final Logger LOGGER = LoggerFactory.getLogger(MyExceptionLogger.class);
    @Override
    public Response toResponse(final Exception exception1) {
        LOGGER.error("", exception1);
        return Response
            .serverError()
            .status(Response.Status.BAD_REQUEST)
            .entity(String.valueOf(exception1.toString()))
            .build();
    }
}

@javax.ws.rs.ApplicationPath("webresources")
public class ApplicationConfig extends Application {
    @Override
    public Set<Class<?>> getClasses() {
        final Set<Class<?>> resources = new java.util.HashSet<>();
        addRestResourceClasses(resources);
        return resources;
    }
    private void addRestResourceClasses(final Set<Class<?>> resources) {
        resources.add(MyExceptionLogger.class);
    }        
}
...