ExceptionMapper在Jersey 2.x&使用javax

时间:2016-10-07 05:30:54

标签: java jersey jersey-2.0 javax.ws.rs

我在api应用程序中使用javax and jersey(暴露api端点) 我试图通过让一个实现ExceptionMapper的Provider来捕获来自fasterXml的异常(在put和post调用中)。

我的问题是,在POST或PUT上,每当我发送错误的属性名称时,我的映射器有时会捕获异常,有时它不会。 例如:

  1. 运行我的应用程序一次 - >一切都按预期工作,捕捉异常。

  2. 再次运行我的应用程序(重启) - >映射器没有捕获任何东西

  3. 我正在使用Jersey 2.x,在tomcat中托管(不使用spring或类似的东西)。

    的web.xml:

    <servlet>
        <servlet-name>api-service-endpoints</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>
                com.api.providers,
                com.api.resources
            </param-value>
    
        </init-param>
        <init-param>
            <param-name>jersey.config.server.provider.classnames</param-name>
            <param-value>org.glassfish.jersey.filter.LoggingFilter</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    

    提供者代码:

    @Provider
    public class JsonMappingExceptionProvider
        implements ExceptionMapper<JsonMappingException> {
    
    public JsonMappingExceptionProvider() {
        log.info("JsonMappingExceptionProvider created..");
    }
    
    private static final Logger log = LoggerFactory
            .getLogger(JsonMappingExceptionProvider.class);
    
    @Override
    public Response toResponse(JsonMappingException exception) {
        log.error("Error while parsing input", exception);
        Response response = createBadRequestResponse();
        return response;
    }
    

    有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我在Jersey Exception mappers not working when jackson deserialization fails

的帮助下找到了解决方案

由于jersey正试图在其映射器列表中找到给定异常的最佳匹配,因此您必须将映射器映射到您尝试捕获的确切异常,因为映射器的顺序是任意的。杰克逊拥有它自己的普通json异常映射器,因此你应该尝试让你的映射器捕获你想要的异常。