【问题标题】:what is the use of @PersistentContext and @Stateless in JAX-RS?在 JAX-RS 中 @PersistentContext 和 @Stateless 有什么用?
【发布时间】:2014-08-26 18:14:45
【问题描述】:

我对使用 JAX-RS 很陌生。我所经历的教程通过展示如何发出GET/POST/DELETE 请求使其变得非常简单。但是没有经过高级注释。现在我正在阅读 Java EE 7 Essentials 一书。我对我在这里看到的许多新注释感到困惑。我试图找到这些注释的实用性。但我不明白。我一直发现 SO 答案对于初学者来说很容易理解。

这是来自github的代码:

Employee.Java

@Entity
@Table(name = "REST_DB_ACCESS")
@NamedQueries({
@NamedQuery(name = "Employee.findAll", query = "SELECT e FROM Employee e")
})
@XmlRootElement
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(length=40)
private String name;
public Employee() { }
public Employee(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return name + " " + id;
}
@Override
public boolean equals(Object obj) {
if (null == obj)
return false;
if (!(obj instanceof Employee))
return false;
Employee that = (Employee)obj;
if (that.name.equals(this.name) && that.id == this.id)
return true;
else
return false;
}
@Override
public int hashCode() {
return Objects.hash(this.id, this.name);
}
}

EmployeeResource.Java

 @Path("employee")
    @Stateless
    public class EmployeeResource {
    @PersistenceContext
    EntityManager em;
    @GET
    @Produces("application/xml")
    public Employee[] get() {
    return em.createNamedQuery("Employee.findAll", Employee.class).getResultList().toArray(new Employee[0]);
    }
    }

MyApplication.java

@javax.ws.rs.ApplicationPath("webresources")
public class MyApplication extends Application {
}
  1. EmployeeResource类有什么用?那是设计模式吗?我可以在get() 方法中使用DAO 访问来做到这一点吗?
  2. @PersistentContext@Stateless 是什么意思?我确实在谷歌中搜索了这些注解。但我不相信我理解它
  3. Application 类有什么用?它总是需要吗?在我经历的教程中,没有提到Application 类。同样的道理,@ApplicationPath 注解是什么意思?

感谢您的宝贵时间!

【问题讨论】:

    标签: rest annotations jax-rs


    【解决方案1】:
    1. EmployeeResource 类有什么用?那是设计模式吗?我可以在 get() 方法中使用 DAO 访问来做到这一点吗?

      EmployeeResource 类代表您的 RESTful 服务。从中您将使用@GET@PUT@POST@DELETE 等公开不同的方法。

    2. @PersistentContext 和@Stateless 是什么意思?我确实在谷歌中搜索了这些注解。但我不相信我理解它

      @PersistenceContext 是一个 JPA 注释。 JPA 涵盖了数据库数据与 Java 域模型之间的转换。由于 RESTful 服务通常表示以 Java 域对象为参数的 CRUD(创建、读取、更新、删除)操作,因此使用 JPA 进行实际的持久化操作非常方便。

      @Stateless 是一个 EJB(会话 Bean)注解。这意味着 bean 不能在调用之间维护任何类型的状态。

    3. 应用类有什么用?它总是需要吗?在我经历的教程中,没有提到应用程序类。同样的道理,@ApplicationPath 注解是什么意思?

      这是一种提取未使用@Provider 注释的片段的有用方法。一个有用的注释是@ApplicationPath 注释(参见:http://docs.oracle.com/javaee/6/api/javax/ws/rs/ApplicationPath.html)。这将设置路径的第一部分,然后是资源类上的 @Path 集,最后是 REST 操作本身的 @Path 集。

    【讨论】:

    • 非常感谢您的解释。如果我没有在上面的类中指定@Stateless Annotation 会发生什么?
    • 此外,带有@ApplicationPathApplication 子类在JavaEE6 或7 环境中是强制性的,因为它将“激活” JAX-RS 支持。此 Java 类的替代方法是在 web.xml 文件中声明
    • 也可以用 @ApplicationPath 注释资源类本身并让它实现 Application 参见 example
    猜你喜欢
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 2011-10-26
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多