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

如果接收到无效的JSon,则不会调用ExceptionMapper

水睿
2023-03-14

我正在使用Jersey 2.5.1和Jackson 2.2。用于构建JSON Rest web服务。我也用2个ExceptionMappers启动并运行了它,但对于“非json”请求,应用程序不会抛出任何异常!

>

  • 如果抛出NullPointerException,将调用ExceptionMapper

    如果JSon映射有问题,将调用ExceptionMapper

    我的问题:1.请求正文:{}工作2.请求正文:{}带有应用程序端NullPointer调用了第一个异常映射器3.请求正文:“jibberish”不会调用任何东西(未被任何ExceptionMapper捕获),因为没有抛出异常。不幸的是,响应正文类似于:无法识别的字段“xxx”(类com.sample.MyDto),未标记为可忽略(9个已知属性......

  • 共有2个答案

    郭翰墨
    2023-03-14

    我还发现有时coustom ExceptionMapper不起作用,也不总是起作用或不起作用。

    所以我调试了jersey的源代码。

    类别:组织。玻璃鱼。运动衫服务器ServerRuntime,方法:mapException

     ...
     final long timestamp = tracingLogger.timestamp(ServerTraceEvent.EXCEPTION_MAPPING);
     **ExceptionMapper mapper = runtime.exceptionMappers.findMapping(throwable);**
     if (mapper != null) {
          request.getRequestEventBuilder().setExceptionMapper(mapper);
     ...
    

    如果映射器为null,则coustom ExceptionMapper将不起作用。

    类别:组织。玻璃鱼。运动衫内部的ExceptionMapperFactory方法:ExceptionMapperFactory

    异常映射器:(有两个异常映射同一个异常:java.lang.Exception)

    组织。玻璃鱼。运动衫服务器mvc。内部的ErrorTemplateExceptionMapper@6473fc2,java类。lang.异常

    ...

    通用域名格式。html" target="_blank">百度。ssp。网状物ws。例外BaseExceptionMapper@7a84639c,java类。lang.异常

    这是因为在MVC功能中:

     @Override
    public boolean configure(final FeatureContext context) {
        final Configuration config = context.getConfiguration();
    
        if (!config.isRegistered(ErrorTemplateExceptionMapper.class)) {
            context.register(ErrorTemplateExceptionMapper.class);
            context.register(new MvcBinder());
    
            return true;
        }
    
        return false;
    }
    

    ErrorTemplateExceptionMapper也添加到ExceptionMapper。

    因此,我将自定义MapperException的泛型类型:ExceptionMapper更改为ExceptionMapper

    可能是我的决议不适合你,主要问题是例外。

    支华池
    2023-03-14

    好吧,我解决了。最终让我认为正确的方法是,有时它是有效的,所以它必须是一些覆盖类加载问题。

    在我的应用程序类中,我基于这样的包注册了提供者

        @ApplicationPath("resources")
        public class JerseyApplication extends ResourceConfig {
        public JerseyRestApplication() {            
            packages("com.sample", "com.fasterxml.jackson.jaxrs.json");
        }
    }
    

    如果你看清楚了,你可能会看到错误!我把com.fasterxml.jackson.jaxrs.json放在搜索路径上,因为我想使用JacksonJsonProvider.class.我不知道的是,在那个包中还有一些JSonMapper for JSonParseException等,这些不记录:)

    所以有时应用程序先加载我的,有时加载jackson的。所以我现在要坚持以下几点:

    @ApplicationPath("resources")
    public class JerseyRestApplication extends ResourceConfig {
        public JerseyApplication() {
            register(JacksonJsonProvider.class); // Do it manually
    
            packages("com.sample");
        }
    }
    

    希望那对某人有帮助: D

     类似资料:
    • 问题内容: 我有以下代码,该代码在远程服务器上安排任务,然后使用轮询完成。任务完成后,它将下载结果。我想将a返回给调用方,以便他们可以确定阻止时间和阻止时间,并为他们提供取消任务的选项。 我的问题是,如果客户端取消该方法返回的值,则块不会执行。如果我删除它。很明显,我对构图有些误解…我应该改变什么? 同样,如果我这样做: 代替 也永远不会执行。这对我来说似乎很违反直觉。从逻辑上说,返回应该不是我应

    • 所以我现在正在开发一个PWA。 我现在正在处理推送通知,并且已经能够通过以下非常简单的JSON结构接收后台和前台通知。 最后,我尝试在setBackgroundMessageHandler中硬编码图标和click_action,但没有成功。如果不显示图标,则单击通知时不会发生任何情况。 这纯粹是一个Ionic PWA项目,意在移动浏览器和桌面上运行。我会很感激你给我的每一个小费!谢谢!

    • 在这个java方法中,扫描器接收最小值和最大值之间的整数。如果接收到的int超出这些界限,程序将正确输出“无效输入”。然而,如果输入了诸如“g”或“h”之类的内容,或者输入了int以外的内容,就会创建一个无休止的循环。 我试图在代码中的多个位置重新初始化扫描仪,但它看起来像是从System.in输入int以外的东西时,它只是再次通过扫描仪飞行并保持循环。任何想法

    • 我正在使用PHPMailer通过联系人表单发送电子邮件。当我在输入字段中输入无效的电子邮件地址时,电子邮件仍会发送。我想同时执行客户端和服务器端验证。 PHPMailer是否有一个内置的验证系统来检查无效的电子邮件地址?如果输入的电子邮件无效,我想返回一个错误,而不是发送电子邮件。

    • 我们在测试和生产中得到了这一点。它是连续的,我们不知道这些错误是如何每隔几秒钟就出现的,至少我们在测试中没有从另一个系统得到反馈。 我们的信息非常小,最多只有几百字节。 这是 1.2 GB。我尝试将:套接字.request.max.字节设置为1195725856,但随后内存不足,即使堆大小约为2.5 GB,并且OpenShift容器设置为最大32GB。 非常欢迎任何帮助!

    • 我确信这是一个非常简单的东西,但由于我是一个Python/tKinter n00b,它打败了我,我已经完成了谷歌搜索。感激地得到的任何帮助:)