Glassfish中的CDI JAX-RS Bean验证4

时间:2013-11-29 16:24:55

标签: jax-rs cdi bean-validation glassfish-4 java-ee-7

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

@Path("invoices")
public class InvoiceResource {

    @Inject
    private InvoiceStore invoiceDao;

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    public Response create(@Context UriInfo uri, InvoiceDto invoiceDto) {

我想添加InvoiceDto的验证,所以我添加了一个注释:

@POST
@Produces(MediaType.APPLICATION_JSON)
public Response create(@Context UriInfo uri, @Valid InvoiceDto invoiceDto) {

现在看来这打破了CDI。我开始收到以下错误:

org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at Injectee(requiredType=InvoiceStore,parent=InvoiceResource,qualifiers={})

我期待验证异常。我究竟做错了什么?我正在使用glassfish 4 web profile,如果我理解正确将params应用验证是Java EE 7 CDI 1.1规范的一部分。

2 个答案:

答案 0 :(得分:1)

它的明确形式错误,它不是Bean验证问题,而是它的DI问题。实际问题是Jersey JAX-RS实现使用HK2 DI框架,HK2不仅仅知道CDI bean。您必须为HK2注入绑定提供CDI bean。你可以关注this post

HK2 Glassfish Integration

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. 

同样的问题posted here

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

答案 1 :(得分:1)

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

http://www.rogerdelafuente.com/glassfish-4-jax-rs-cdi-bean-validation-bug/

感谢所有介入的人,了解HK2的事情对我帮助很大。最后,它应该可以在没有任何黑客的情况下工作,一旦修复了这个错误,就可以使应用程序移植。