java - 在Spring Service Layer中使用HttpServletRequest

环境 :

春季MVC 3

角JS

雄猫6

问题 :

我们正在将旧版应用程序从struts2迁移到spring MVC REST,并以angular JS作为UI。
这是典型的SPA。

典型的应用程序流程是:Angular JS + Spring REST控制器+ Service

struts2操作中的业务逻辑已移至服务类。

我的问题是-在Spring中使HttpServetRequest对象可用于Service类的正确方法是什么?

可用的两个选项是:

1)将HttpServletRequest传递给Spring MVC控制器方法。将相同的HttpServetRequest传递给Spring服务层。
  但这将导致HttpServletRequest成为Service接口的一部分,例如-

public ProductDto getProductDetails(HttpServletRequest req,int productId)


这是正确的方法吗? HttpServletRequest可以成为Service接口的一部分吗?

2)使用Spring提供的API:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();


请对此进行指导?

最佳答案

除了上述提到的选项之外,您还可以在服务层中引入类或其他抽象,然后使用HttpServletRequest的必需部分填充它,并在服务层中使用该抽象。

例如(从Spring Data借来的),假设您要访问pagesizesort以及来自HttpServletRequest的与用户相关的查询字符串。除了将请求传递给服务层方法之外,还可以将这些参数封装为一个抽象,例如PageableUserFilterCriteria

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);
}


这样,您可以轻松地在与服务层相同的抽象级别上定义抽象。