当前位置: 首页 > 知识库问答 >
问题:

ExceptionMapper在泽西2. x中不一致工作

张财
2023-03-14

我将javax和jersey用于我的api应用程序(公开apiendpoint),我试图通过提供一个实现ExceptionMapper的提供者来捕获来自fasterXml的异常(在put和post调用时)。

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

>

  • 运行我的应用程序一次-

    再次运行我的应用程序(重启)-

    我正在使用球衣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个答案

    林德辉
    2023-03-14

    我找到了解决方案的帮助泽西异常映射不工作时杰克逊反序列化失败

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

     类似资料:
    • 编辑:这是ackson jaxrs-base早期版本中的一个问题,已在jackson-jaxrs-base-2.8中解决。https://github.com/FasterXML/jackson-jaxrs-providers/issues/22 我正在努力解决这个问题,只有mapper例外。我想映射com的所有子级。fasterxml。杰克逊。果心JsonProcessingException在

    • 我使用带有spring boot的jersey,我有一个异常映射器: 同样注册,并使用调试,我可以看到这个映射器被正确调用,但是无论使用junit测试还是手动测试,最终响应仍然返回404。 以下是测试: 然后在泽西岛配置中注册:

    • 我是新来的泽西框架。只是想知道使用异常映射器的优势是什么。如果我想把任何错误抛给其他消费者,我可以在方法中执行以下操作,Response.status(502)。实体(“注册期间服务器错误”)。build();为什么建议使用异常映射器,请帮助我理解?

    • 错误: 找不到媒体type=application/xml、type=class com.example.DemoRest2.Employee、genericType=class com.example.DemoRest2.Empayee的MessageBodyWriter。 我想返回Employee的对象。类,但获取上述错误。我正在使用@XmlRootElement注释。然而,当我以字符串格式返

    • 我在这里看到了不同的答案,它们都是关于在请求调用期间添加头的。我想在客户机配置中添加标题,然后将其注册到客户机本身。 我环顾四周,发现我可以创建一个自定义ClientRequestFilter,但看看方法签名,我看不到任何可以添加多个标题的方法-它们都像字符串一样作为第一个参数,然后像列表一样。 例如,我想添加以下标题: 我想出了下面的代码,但实际上似乎只使用了第一个方法调用。我检查了调试器,所有