环境:
Spring MVC 3
Angular JS
Tomcat 6
问题:
我们正在使用角度JS作为UI将遗留应用程序从struts2
迁移到spring MVC REST
。
这是一个典型的SPA。
典型的应用程序流程是:Angular JS + Spring REST控制器+服务层
struts2操作中的业务逻辑被移动到服务类。
我的问题是 - 在Spring中将HttpServetRequest对象提供给Service类的正确方法是什么?
有两种选择:
1)将HttpServletRequest
传递给Spring MVC控制器方法。将相同的HttpServetRequest
传递给Spring服务层。
但这会导致HttpServletRequest
成为服务界面的一部分,如 -
public ProductDto getProductDetails(HttpServletRequest req,int productId)
这是正确的方法吗? HttpServletRequest
可以成为服务界面的一部分吗?
2)使用Spring提供的API:
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
请指导一下吗?
答案 0 :(得分:4)
除了上面提到的选项之外,您还可以在服务层中引入一个类或另一个抽象,然后使用HttpServletRequest
的必需部分填充它,并在服务层中使用该抽象
例如(借用Spring数据),假设您要访问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);
}
通过这种方式,您可以轻松地在与服务层相同的抽象级别中定义抽象。
答案 1 :(得分:2)
您不应该将HttpServletRequest / -Response作为服务层的一部分,因为HttpServletRequest / -Response是特定于您的用户界面/视图技术的类。 将它们引入您的服务层将使您的服务层依赖于用于用户界面的技术,从而使以后更难以更改UI / View技术。