我构建了在嵌入式 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/