Can';t使用javax.ws.rs.ext.ExceptionMapper捕获400个错误请求

Can';t使用javax.ws.rs.ext.ExceptionMapper捕获400个错误请求,java,jax-rs,wildfly,wildfly-11,Java,Jax Rs,Wildfly,Wildfly 11,我有一个REST服务方法,它使用POSThttp方法并接受application/json。JSON绑定到JAXB bean: @POST public void test(final HierResult obj) throws Exception { printHierResult(obj); } @XmlRootElement public static class HierResult { public String dummy; } 我注意到,当有人向我发送一个包含

我有一个REST服务方法,它使用
POST
http方法并接受
application/json
。JSON绑定到JAXB bean:

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

@XmlRootElement
public static class HierResult {
    public String dummy;
}
我注意到,当有人向我发送一个包含未知字段的语法有效的JSON时,比如
{“aaa”:“bbb”}
则不会记录任何错误,但web服务器返回:

HTTP/1.1 400 Bad Request
Server: WildFly/11

Unrecognized field "aaa" (class HierResult), not marked as ignorable
所以问题是:如何记录此错误?

我为
java.lang.Exception
注册了一个
ExceptionMapper
,但它只能捕获
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);
    }        
}
@Provider
公共类MyExceptionLogger实现ExceptionMapper{
私有静态最终记录器Logger=LoggerFactory.getLogger(MyExceptionLogger.class);
@凌驾
公众响应(最终例外情况1){
LOGGER.error(“”,异常1);
返回响应
.serverError()
.状态(响应.状态.错误请求)
.entity(String.valueOf(异常1.toString()))
.build();
}
}
@javax.ws.rs.ApplicationPath(“webresources”)
公共类应用程序配置扩展应用程序{
@凌驾
public Set>resources=new java.util.HashSet();
添加资源类(资源);
归还资源;
}

private void addrestresourcelasses(final Set正如@PaulSamsotha评论的那样,必须注册一个具有相同或更多优先级异常类的映射器

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <version>2.10.2</version>
  <artifactId>jackson-databind</artifactId>
  <scope>provided</scope>
</dependency>

com.fasterxml.jackson.core
2.10.2
杰克逊数据绑定
假如
_

import com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException;
公共类TestMapper实现ExceptionMapper{
私有静态最终记录器Logger=LoggerFactory.getLogger(TestMapper.class);
@凌驾
公众响应(最终未识别的属性异常1){
LOGGER.error(“服务器端错误”,例外1);
返回响应
.serverError()
.status(Response.status.INTERNAL\u SERVER\u错误)
.entity(String.valueOf(Response.Status.INTERNAL_SERVER_ERROR))
.build();
}
}

没有引发BadRequestException,因此没有什么可捕获的。发生的情况是Jackson为JsonParseException和JsonMappingException提供了ExceptionMapper,它们返回的响应为400。您可以为相同的异常创建自己的映射器来覆盖此行为。我需要完全相同的。有人有代码吗分享来解决这个问题?@phe看到答案了吗
import com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException;

public class TestMapper implements ExceptionMapper<UnrecognizedPropertyException> {

    private static final Logger LOGGER = LoggerFactory.getLogger(TestMapper.class);

    @Override
    public Response toResponse(final UnrecognizedPropertyException exception1) {
        LOGGER.error("server side error", exception1);
        return Response
            .serverError()
            .status(Response.Status.INTERNAL_SERVER_ERROR)
            .entity(String.valueOf(Response.Status.INTERNAL_SERVER_ERROR))
            .build();
    }
}