我有一个带注入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规范的一部分。
答案 0 :(得分:1)
它的明确形式错误,它不是Bean验证问题,而是它的DI问题。实际问题是Jersey JAX-RS实现使用HK2 DI框架,HK2不仅仅知道CDI bean。您必须为HK2注入绑定提供CDI bean。你可以关注this post
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的事情对我帮助很大。最后,它应该可以在没有任何黑客的情况下工作,一旦修复了这个错误,就可以使应用程序移植。