0

我正在使用javax and jersey我的 api 应用程序(公开 api 端点)我试图通过拥有一个实现 ExceptionMapper 的提供程序来捕获来自 fastXml 的异常(在 put 和 post 调用上)。

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

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

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

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

网页.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;
}

有任何想法吗?

4

1 回答 1

1

当杰克逊反序列化失败时,我在 Jersey Exception mappers 的帮助下找到了解决方案

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

于 2016-10-07T05:58:23.413 回答