【问题标题】:RESTful Webservices Integration With Spring and HibernateRESTful Web 服务与 Spring 和 Hibernate 的集成
【发布时间】:2013-11-28 23:37:25
【问题描述】:

我正在学习RESTful Webservice。

我正在使用 Hibernate 4 和 Spring 3。我想知道我是否需要实现 REST 服务,我从 MyController 类中调用服务实现类 EmployeeServiceImpl?并从客户端层调用 REST 的 get、delete 方法?

如果使用Spring,哪个REST项目可以使用CXF或Jersey? 为 REST 服务创建 Controller 类的最佳方法是什么?

服务实现类

@Transactional
@Service(value = "empService")
public class EmployeeServiceImpl implements EmployeeService {

@Inject
EmployeeDAO employeeDAO;

@Override
public List<Emp> findAllEmployees() {
return getEmployeeDAO().findAllEmployees();
}

DAO 实现类

@Repository("empDAO")
public class EmployeeDAOImpl extends GenericDAOImpl<Emp> implements EmployeeDAO {

@PersistenceContext
private EntityManager entityManager;

@Override
public List<Emp> findAllEmployees() {
CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(Emp.class));
return getEntityManager().createQuery(cq).getResultList();
}

【问题讨论】:

  • 这不是您问题的答案,但您可能需要认真考虑使用 Spring Data REST 和 Spring Data JPA 作为您正在做的事情的替代方案。您甚至不需要编写 DAO 实现类;您可以免费获得它们。
  • @JonathanW 如果我使用的是 Spring Data JPA,那么我需要 Hibernate 吗?
  • Hibernate 是 JPA 的实现者,因此您需要在运行时包含它。但仅此而已。

标签: java spring web-services hibernate rest


【解决方案1】:

JAX-RS 实现(RESTeasy、Jersey)完全是 J2E,这意味着您不需要使用 Spring。但你可以以任何方式使用它。

这里是一个简单的服务示例,用正确的注释装饰,然后不需要任何控制器:

package com.mkyong.rest;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;

@Path("/hello")
public class HelloWorldService {

    @GET
    @Path("/{param}")
    public Response getMsg(@PathParam("param") String msg) {

        String output = "Jersey say : " + msg;

        return Response.status(200).entity(output).build();

    }

}

来源:http://www.vogella.com/articles/REST/article.html

确实,这个 JSR (331) 的神奇之处在于您不需要控制器,它会自动映射来自的调用

/context/{defined_sub_context}/{entity}/{params}

/org.corp.package.app.services.class

如果类用@Path("{entity}) 和方法@Path("/{param}") 修饰

很好,不是吗?

【讨论】:

  • 让谢谢你。想知道我是否想在服务实现类中调用findAllEmployees() 方法,我该怎么做?
  • HMmm .. 听起来不是很清楚。您想使用 Spring 从您的服务中调用 EmployeeDAO.findAllEmployees() 吗?
  • Jean 我想我把它弄糊涂了。我的疑问是如何使用 REST 调用 findAllEmployees()?即使我没有像你提到的那样使用 Spring。
  • 您有任何表示层的框架吗?如果您只有 Servlet(我真的怀疑;)),请实现 doGet、doPost、doDelete 或 doPut 方法并从那里调用 findAllEmployees(并在您的 web.xml 中声明任何新的 servlet)。如果你有 SpringMVC、Tapestry、Struts 或其他任何框架,编写控制器然后遵循框架约定,但你可能不是 RESTful(因为它不会处理 PUT 或 DELETE,并且可能会混淆 POST 和 GET)。如果您真的想成为 RESTful,请不要编写任何控制器,只需将 JAX-RS 注释放在您的服务上,就像上面一样。
猜你喜欢
  • 2016-05-25
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 2014-12-05
  • 2015-10-21
  • 2012-12-07
  • 2018-11-18
  • 2017-05-31
相关资源
最近更新 更多