Java 向struts应用程序添加rest服务

Java 向struts应用程序添加rest服务,java,rest,struts,jersey,Java,Rest,Struts,Jersey,我正在尝试使用jersey将rest服务添加到struts应用程序中。为此,我需要以struts和rest api都可以访问的方式分离java代码。这样做是为了让代码在rest和struts之间共享,任何更改都会反映在这两个服务中。我想知道,这个想法在多大程度上是可行的,这是否就是人们通常设计rest服务的方式。虽然我们的表示层不是基于Struts的(通常是SpringWebMVC或JSF),但我们在这种情况下使用Spring3.0+JavaEE6,特别是EJB3.0和JPA2.0 EJB3.0

我正在尝试使用jersey将rest服务添加到struts应用程序中。为此,我需要以struts和rest api都可以访问的方式分离java代码。这样做是为了让代码在rest和struts之间共享,任何更改都会反映在这两个服务中。我想知道,这个想法在多大程度上是可行的,这是否就是人们通常设计rest服务的方式。

虽然我们的表示层不是基于Struts的(通常是SpringWebMVC或JSF),但我们在这种情况下使用Spring3.0+JavaEE6,特别是EJB3.0和JPA2.0

EJB3.0无状态会话bean工作得很好—它们可以具有声明性(基于注释的)依赖项注入和事务划分,或者它们可以使用任何传统机制自行管理它们的事务、依赖项和资源。它们与JPA2.0无缝集成,并且很容易进行单元测试。与纯Springbean相比的主要优势是,它们可以独立于Web应用程序(作为EJB JAR)进行部署

在面向前端的Web服务上,我们也使用Jersey/JAX-RS。因为Jersey/JAX-RS依赖项注入被破坏了(它不像JavaEE的其余部分那样使用Weld/CDI),所以我们不得不求助于SpringDI,用“后端”EJB“连接”面向前端的rest资源类。好的方面是,这可以很好地将EJB注入到我们的MVC控制器中,也可以与JSF管理的bean一起使用。或者,您可以单独使用Spring编写REST-ful资源(任何一种方法都有其优点/缺点,但通常两者都做得很好)

我知道我隐瞒了整件事,但我很乐意应要求分享更多细节


编辑:根据要求提供更多详细信息

您是学习Jersey/JAX-RS的第一站,必须是第一站。还有一些教程/示例,您可以在网上轻松找到

虽然您应该能够将Jersey/JAX-RS资源打包到与Struts页面相同的WAR中,但我们使用了一种更简单的方法,即单独部署它们

现在,当部署到GlassFish3.1时,我们遇到了bug,也有文档记录。底线是,
@EJB
注入并没有像预期的那样为我们工作

因此,我们转而使用
jersey-Spring
contrib模块使用Spring

无论如何,它的其余部分是标准的JavaEE6/EJB3.0。我们识别并将所有常见功能放在“服务”层中,该层主要实现为无状态的EJB

持久性通过JPA
@Entity
s处理,该实体通过JPA inject
EntityManager
访问。使用
@TransactionAttribute
对事务进行声明性划分

下面是一个典型EJB+JPA服务bean的快速示例:

@Stateless
public class WidgetServiceBean implements WidgetService {

    @PersistenceContext
    private EntityManager em;

    @Override
    public List<Widget> findWidgetByName(String name) {
        return em.createNamedQuery("Widget.findByName", Widget.class)
            .setParam("name", name).getResultList();
    }

    @Override
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void removeWidgetById(int id) {
        em.find(Widget.class, id).remove();
    }
}
@无状态
公共类WidgetServiceBean实现WidgetService{
@持久上下文
私人实体管理者;
@凌驾
公共列表findWidgetByName(字符串名称){
返回em.createNamedQuery(“Widget.findByName”,Widget.class)
.setParam(“name”,name).getResultList();
}
@凌驾
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void removeWidgetById(int id){
em.find(Widget.class,id).remove();
}
}
(显然不是生产质量,而是显示了他们的“精益”程度。)

服务层和实体打包为一个EJBJAR,可以单独部署,并通过全局JNDI查找提供给所有其他模块。或者,它们可以部署在Struts或JAX-RS WAR中,从JavaEE6(Glassfish 3.x)开始,它们将被发现,作为模块的一部分部署,并提供给同一WAR中的其他组件

有些人可能会争辩说,如果您使用的是Spring容器,那么只使用SpringBean更简单。我想说,可能吧,但是您还必须使用Spring的持久性框架和Spring的事务框架。(Spring还提供声明性事务和持久性。)如果您已经对Spring进行了大量投资,那么这可能是一条更容易的道路


OTOH、EJB3.0、JPA2.0和JTA也从它们的前辈那里得到了根本性的简化,并且是JavaEE标准的一部分,因此这是一个涉及很多方面的体系结构决策。

Tnx,我想知道关于如何实现的更多细节。