java - 使用 JAX-RS/Jersey 访问数据库和共享资源?

标签 java dependency-injection jersey jax-rs

我构建了在嵌入式 Jetty 8.1 中运行的 Jersey 支持的 Web 服务。该服务必须访问数据库以及由同一进程中运行的其他线程维护的共享状态。

对于 JAX-RS 带注释的资源访问 DAO、数据库、服务器状态和其他共享资源的建议方法是什么?我知道我可以使用单例来提供这样的东西,但我猜一定有更好的方法。

考虑到几乎每个 JAX-RS/Jersey 应用程序都由数据库支持,令我惊讶的是我发现的所有示例都没有展示出访问数据库的良好模式。

更新:我的印象是我可能想要考虑依赖注入(inject)框架,但是我想保持简单。

最佳答案

我个人会考虑使用 JPA 和/或 Hibernate。一旦您建立了实体,它将使事情变得更加简单和清晰。使用您当前已经构建的任何 DAO 都会有一些学习曲线,但从长远来看,我发现这是值得的。

这是一个例子...

实体类

@Entity
@javax.xml.bind.annotation.XmlRootElement
@XmlType(propOrder={"createdOn","empId"})
public class Employee implements Serializable {
    private Date createdOn;
    private Integer empId;

    @Column(nullable=false)
    @Temporal(TemporalType.TIMESTAMP)
    @XmlJavaTypeAdapter(DateAdapter.class)
    public Date getCreatedOn() {
        return createdOn;
    }
    public void setCreatedOn(Date createdOn) {
        this.createdOn = createdOn;
    }

    @Id
    @XmlID
    public Integer getEmpId() {
        return empId;
    }
    public void setEmpId(Integer empId) {
        this.empId = empId;
    }
}

员工资源

@Path("/Employees")
@javax.xml.bind.annotation.XmlRootElement 
public class EmployeeResource {
    List<Employee> employees;

    public List<Employee> getEmployees() {
        return employees;
    }
    public void setEmployees(List<Employee> employees) {
        this.employees = employees;
    }
    @GET
    @Path("/{id}")
    @Produces("application/json")
    public Response getEmployee(@Context UriInfo ui, @PathParam("id") Integer id) {
        Session session = HibernateUtil.getSession();
        session.beginTransaction();
        Criteria criteria=session.createCriteria(Employee.class);
        criteria.add(Restrictions.eq("empId", new Integer(10150)));
        this.employees = criteria.list();
        return Response.ok(this).build();
    }
}

JSON 响应

{
  "employees":{
    "createdOn":"1330915130163",
    "empId":"10150"
  }
}

关于java - 使用 JAX-RS/Jersey 访问数据库和共享资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9570012/

相关文章:

Java 字符串屏幕下推

Java - 具有集合属性的多态性

java - 未调用 Spring Java 配置

java - 将@PathParam 传递给 Jersey 中的子资源定位器类

java - 如何从Rest Client的响应对象中获取url对象

java - 为什么我对字符串的空检查不起作用?

java - Spring-data-cassandra:创建名称为 'sessionFactory' 的 bean 时出错,并且无法解析对 bean 'cassandraTemplate' 的引用

javascript - 如何使用 AngularJS 和 RequireJS 从外部文件注入(inject)服务?

typescript - Angular 5 类通过注入(inject)扩展类

java - 对公共(public)和私有(private)资源使用不同的路径 Jersey + Spring boot