环境:
Spring MVC 3
角度JS
Tomcat 6
问题:
我们正在将遗留应用程序从 struts2
迁移到 spring MVC REST
,并使用 Angular JS 作为 UI。
这是典型的 SPA。
典型的应用流程是:Angular JS + Spring REST controller + Servicelayer
struts2 Action 中的业务逻辑被移动到服务类中。
我的问题是 - 使 HttpServetRequest 对象可用于 Spring 中的服务类的正确方法是什么?
两个可用的选项是:
1)将HttpServletRequest
传递给Spring MVC Controller 方法。将相同的 HttpServetRequest
传递给 Spring 服务层。
但这将导致 HttpServletRequest
成为服务接口(interface)的一部分,例如 -
public ProductDto getProductDetails(HttpServletRequest req,int productId)
这是正确的方法吗? HttpServletRequest
可以成为服务接口(interface)的一部分吗?
2)使用Spring提供的API:
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
请指导一下?
最佳答案
除了那些提到的选项之外,您可以在服务层中引入一个类或另一个抽象,然后用 HttpServletRequest
的所需部分填充它,并在 Service 中使用该抽象层。
例如(借用Spring Data),假设你想访问page
、size
和sort
以及用户相关的查询字符串HttpServletRequest
。除了将请求传递给服务层方法之外,您还可以将这些参数封装到抽象中,例如 Pageable
或 UserFilterCriteria
:
public interface Pageable {
int page();
int size();
List<Sort> sorts();
}
然后不是将 HttpServletRequest
传递给服务层:
public interface UsersService {
List<User> filterUsers(HttpServletRequest request);
}
你可以传递那些新的抽象:
public interface UsersService {
List<User> filterUsers(UserFilterCriteria criteria, Pageable pageable);
}
通过这种方式,您可以轻松地在与服务层相同的抽象级别定义抽象。
关于java - 在 Spring 服务层使用 HttpServletRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37775312/