我正在为作业构建Java EE应用程序。我需要使用JPA来实现持久性,使用EJB来封装我的业务逻辑,并使用Web界面进行演示。春天是不允许的。
我的应用程序包含一个根Maven项目和4个Maven子项目:一个用于我的模型层(JPA实体),一个用于我的业务层(EJB),一个用于我的表示层(Web应用程序),一个用于建立一个EAR。我正在将EAR部署到Glassfish。
然而,我遇到了一些将所有问题放在一起的问题。我的模型层(JAR模块)中有一个实体类,如下所示:
@Entity
public class Product implements Serializable {
@Id @GeneratedValue
private int productId;
...
}
然后我在业务层(EJB模块)中创建了一个服务bean来封装事务逻辑:
@Stateless
public class ProductService {
@PersistenceContext( unitName = "DummyContext" )
EntityManager em;
public Product findById( int id ) {
return em.find( Product.class, id );
}
public List<Product> getAll() {
TypedQuery<Product> query = em.createQuery( "SELECT p FROM Product p", Product.class );
return query.getResultList();
}
}
最后,我在我的表示层(WAR模块)中创建了一个JAX-RS控制器,我正在尝试使用REST访问我的产品服务。
JAX-RS设置:
@ApplicationPath( "/api" )
public class ApplicationConfig extends javax.ws.rs.core.Application {
}
控制器:
@Path( "/products" )
public class ProductController {
@Inject
private ProductService productService;
@Path( "/all" )
@GET
@Produces( "text/plain" )
public String getAll() {
return "Nothing interesting yet";
}
}
正如您所看到的,REST控制器尚未执行任何操作。不过,这个例子现在失败了。部署后第一次尝试访问\api\products\all
时,会抛出以下异常:
javax.servlet.ServletException: Servlet.init() for servlet wedvich.ApplicationConfig threw exception
org.jboss.weld.exceptions.IllegalArgumentException: WELD-001409 Ambiguous dependencies for type [ProductService] with qualifiers [@Default] at injection point [[BackedAnnotatedField] @Inject private wedvich.ProductController.productService]. Possible dependencies [[Session bean [class wedvich.ProductService with qualifiers [@Any @Default]; local interfaces are [ProductService], Session bean [class wedvich.ProductService with qualifiers [@Any @Default]; local interfaces are [ProductService]]]
org.jboss.weld.exceptions.DeploymentException: WELD-001409 Ambiguous dependencies for type [ProductService] with qualifiers [@Default] at injection point [[BackedAnnotatedField] @Inject private wedvich.ProductController.productService]. Possible dependencies [[Session bean [class wedvich.ProductService with qualifiers [@Any @Default]; local interfaces are [ProductService], Session bean [class wedvich.ProductService with qualifiers [@Any @Default]; local interfaces are [ProductService]]]
随后的任何请求都会产生以下异常:
javax.servlet.ServletException: Servlet.init() for servlet wedvich.ApplicationConfig threw exception
java.lang.IllegalStateException: The resource configuration is not modifiable in this context
为什么会这样?是否有任何明显的方法可以用我现在拥有的东西来修复它,或者是我试图固有缺陷的项目组织/架构?
我之前几乎专门使用.NET和ASP.NET MVC进行此类项目,因此尝试使用我在帖子开头列出的约束用Java来完成它对我来说是新的。当涉嫌使用Maven或其他东西时,我很可能搞砸了一些东西,但我不知道该寻找什么。如果有任何我可以提供的相关信息,请告诉我,我会对其进行编辑。
答案 0 :(得分:0)
你应该注入接口而不是类本身!