Glassfish4中的CDI JAX-RS Bean验证

Glassfish4中的CDI JAX-RS Bean验证,jax-rs,cdi,bean-validation,glassfish-4,java-ee-7,Jax Rs,Cdi,Bean Validation,Glassfish 4,Java Ee 7,我有一个带有注入bean的简单JAX-RS InvoiceResource: @Path(“发票”) 公共类发票资源{ @注入 私人发票店发票道; @职位 @产生(MediaType.APPLICATION_JSON) 公共响应创建(@Context UriInfo uri,InvoiceDto InvoiceDto){ 我想将InvoiceDto的验证添加到我正在接收的,所以我添加了一个注释: @POST @产生(MediaType.APPLICATION_JSON) 公共响应创建(@Con

我有一个带有注入bean的简单JAX-RS InvoiceResource:

@Path(“发票”)
公共类发票资源{
@注入
私人发票店发票道;
@职位
@产生(MediaType.APPLICATION_JSON)
公共响应创建(@Context UriInfo uri,InvoiceDto InvoiceDto){
我想将InvoiceDto的验证添加到我正在接收的,所以我添加了一个注释:

@POST
@产生(MediaType.APPLICATION_JSON)
公共响应创建(@Context UriInfo uri,@Valid InvoiceDto InvoiceDto){
现在,这似乎破坏了CDI。我开始得到以下错误:

org.glassfish.hk2.api.unsatifiedpendencyException:在被注射者处没有可用于注射的对象(requiredType=InvoiceStore,parent=InvoiceResource,限定符={})

我期待着一个验证异常istead。我做错了什么?我使用的是glassfish 4 web概要文件,如果我理解正确,那么将验证应用到params是Java EE 7 CDI 1.1规范的一部分。

它的明显形式错误不是Bean验证问题,而是DI问题。实际问题是Jersey JAX-RS实现使用了在HK2 DI框架中,HK2不仅仅知道CDIBeans。您必须使CDIBeans可用于HK2注入绑定。您可以按照

同一问题


简单的解决方案是,如果您想使用weld CDI,那么只需在web-inf中放入空的beans.xml文件。

这是Glassfish 4.0.0实现中的一个错误。我发现了这篇文章,它描述了正在发生的事情并给出了解决方法:


感谢所有参与的人,它帮助我理解了HK2。最后,它应该在没有任何黑客攻击的情况下工作,使应用程序可以移植,一旦这个错误被修复。

是否有类型为
InvoiceStore
的CDI bean?这似乎与bean验证无关。@Gunnar是的,没有验证,它确实可以正常工作,所以我把beans.xml放错地方了,我认为我一直在使用WELD。现在,我把它移到了WEB-INF。现在我仍然得到了错误,并且确实看到了你提到的另一个问题,但这似乎是对Glassfish的攻击。这能移植到其他AppServer吗?JEE7标准的方式是什么?很清楚:Jersey的JAX实现-RS使用它自己的DI框架,我需要手动将标准CDI粘附到它上。但这不是AppServer的任务吗?如果我换到另一个使用其他JAX-RS实现的AppServer会发生什么?对于CDIBeans.xml,无论您使用的是RI,它都是必需的。它的weld或OpenWebBean哦,它不是一个玻璃鱼错误。替换t正如文章所说,他消除了这个问题。你可以尝试文章中的例子。我的是GlassFish Server开源版本4.0(build 89),但我是从maven和cargo(cargo:run)运行它的,cargo:run从
HK2 can be used in GlassFish applications. Every deployed GlassFish application has
a unique ServiceLocator associated with it that can be looked up with 
  JNDI name java:app/hk2/ServiceLocator.