播放 2.4 Messages 对象抛出 NullPointerException

Posted

技术标签:

【中文标题】播放 2.4 Messages 对象抛出 NullPointerException【英文标题】:Play 2.4 Messages object throwing NullPointerException 【发布时间】:2015-12-23 15:31:28 【问题描述】:

此问题仅在测试模式下发生。基本上我在一个正在测试的类中有一些对 Messages.get() 的调用

Messages.get("api.parser.missing.id")

这存在于

public long getParserId() throws UnknownParserIdException 
        if (parserEntity == null || parserEntity.parserId == 0) 
            throw new UnknownParserIdException(Messages.get("api.parser.missing.id"));
        
        return parserEntity.parserId;
    

在我的测试中,我有以下内容

@Test
public void testSaveAndGetParserId() 

    try 
        addParserService.attachAppId(appId);
        addParserService.attachParserJson(jsonToAttach);
        addParserService.transformAttachedJson();
        addParserService.saveParserEntity();
        Long parserId = addParserService.getParserId();
        boolean isPositive = parserId > 0;
        assertTrue(isPositive);
        ParserRepository parserRepository = new ParserRepository();
        parserRepository.deleteParserById(parserId);
    
    catch (MalformedParserException | UnknownAppIdException | UnknownParserIdException e) 

        assertTrue(false);
    

现在,每当我运行这个测试时,我都会得到以下 NPE

[error] Test services.AddParserServiceTest.testTransformNoJsonAttached failed: java.lang.NullPointerException: null, took 0.09 sec
[error]     at play.api.i18n.DefaultMessagesApi.preferred(Messages.scala:482)
[error]     at play.api.i18n.DefaultMessagesApi.preferred(Messages.scala:488)
[error]     at play.i18n.MessagesApi.preferred(MessagesApi.java:128)
[error]     at play.mvc.Http$Context.messages(Http.java:173)
[error]     at play.mvc.Http$Context.lang(Http.java:165)
[error]     at play.i18n.Messages.getLang(Messages.java:29)
[error]     at play.i18n.Messages.get(Messages.java:109)
[error]     at services.impl.AddParserService.transformAttachedJson(AddParserService.java:31)
[error]     at services.AddParserServiceTest.testTransformNoJsonAttached(AddParserServiceTest.java:57)

我有其他不属于我的服务包的类和测试使用 il8n 类就好了。

我检查过的东西

被调用的消息确实存在于消息中 消息文件列在 application.conf 中(包含在 application.test.conf 中) 在我的服务类中删除对 Messages.get() 的调用修复了 NPE,但我显然不想这样做。

【问题讨论】:

你在 Play 代码中有七个栈帧。您是否已进入 Play 代码以查看 null 是什么?这似乎是开始的地方。 好问题。老实说,我从来没有设置过调试器来玩,你有什么好的材料吗?这可能会在未来为我省去很多麻烦。 【参考方案1】:

如果它仅在测试您的应用程序时发生,可能是由于您的资源文件无法在您的测试文件夹中访问。确保您要测试的文件在您的测试文件夹中。

相关帖子:play2 does not resolve messages when run from a unit test

【讨论】:

它在conf中的默认位置。为什么play不能从那里读取呢?将它放在测试根目录中不会修复它。

以上是关于播放 2.4 Messages 对象抛出 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

即使使用 NON_NULL,Jackson ObjectMapper 也会抛出 NullPointerException

播放 2.4 值 confDirectory 不是对象 play.PlayImport.PlayKeys 的成员

Restkit嵌套对象映射问题

播放框架,子文件夹中的 i18n "messages.*"

C#中如果用await关键字来await一个为null的Task对象会抛出异常

多线程下使用HttpContext.Current.Cache.Get(key) 获取缓存时抛出null错误