【发布时间】: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