将EJB注入JAX-RS REST控制器

时间:2014-05-13 08:32:50

标签: java maven java-ee ejb jax-rs

我正在为作业构建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或其他东西时,我很可能搞砸了一些东西,但我不知道该寻找什么。如果有任何我可以提供的相关信息,请告诉我,我会对其进行编辑。

1 个答案:

答案 0 :(得分:0)

你应该注入接口而不是类本身!