【问题标题】:Wildfly 15.0.1 JAX-RS @BeanParam NPE for getter methodsWildfly 15.0.1 JAX-RS @BeanParam NPE 用于 getter 方法
【发布时间】:2019-01-31 23:27:46
【问题描述】:

我正在 Wildfly 15.0.1 中测试 JAX-RS 注释 @BeanParam,但在尝试通过 getter 方法访问字段值时遇到 NPE。

如果我改用@FormParam,一切正常。在 Eclipse 调试器中,如果我直接访问该字段(而不是通过 getter 方法),则该值就在那里。但是,如果我尝试通过它的 getter 方法访问字段值,它会返回 null 并因此返回 NPE。下面是来自 Eclipse 调试器的屏幕截图,显示该字段具有值,但 getter 方法返回 null。

我正在尝试做的代码sn-ps:

@RequestScoped  
public class TestFilter {  
    @FormParam("date_fr")  
    private String dateFr;  
    ...  
}  

@ApplicationScoped  
@Path("/test")  
public class TestRes {  
    @POST  
    @Path("/search")  
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)  
    public Response search(@BeanParam TestFilter filter) throws IOException {  
        if (filter.getDateFr().length() > 0) { // NPE here: filter.getDateFr() is null  

        }  
    }  
}  

有人知道这里的@BeanParam 是怎么回事吗?我做错了吗?

【问题讨论】:

  • 你为什么使用@RequestScoped
  • @PaulSamsotha 没有特别的原因。我只是在测试 JAX-RS 功能。但你是对的,没有@RequestScoped 它可以工作。我还用 OpenLiberty 进行了测试,@RequestScoped 没有问题。我不确定这是否是一个错误。希望熟悉相关规范的人多说点。
  • 不同的实现会对规范中未提及的事物具有不同的行为,而本用例则没有。对于这种特殊情况,没有理由 BeanParam 应该具有范围注释。
  • @PaulSamsotha 感觉不太对劲。如果没有明确的范围注释,默认情况下 bean 不是 @Dependent 范围吗?如果这是真的,那么在这种情况下,为什么不同的作用域会使@BeanParam 的行为有所不同?
  • bean 与特定请求相关联。没有理由它应该在任何其他范围内。它专门用于将@XxxParams 组合到一个 bean 中以便于访问。 CDI 不参与。 JAX-RS 实现处理这个 bean 的创建,你应该把它留给它。

标签: java jax-rs wildfly resteasy


【解决方案1】:

罪魁祸首是@RequestScoped 注释。没有它,它按预期工作。

有人报告了一个针对此的 Jira 错误:https://issues.jboss.org/browse/WFLY-11680

【讨论】:

    猜你喜欢
    • 2017-09-26
    • 2014-09-14
    • 2018-11-12
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    相关资源
    最近更新 更多