在Spring Service Layer中使用HttpServletRequest

时间:2016-06-12 14:22:28

标签: java spring spring-mvc

环境:

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

请指导一下吗?

2 个答案:

答案 0 :(得分:4)

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

例如(借用Spring数据),假设您要访问page中的sizesortHttpServletRequest以及与用户相关的查询字符串。您也可以将这些参数封装到抽象中,而不是将请求传递给服务层方法,例如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);
}

通过这种方式,您可以轻松地在与服务层相同的抽象级别中定义抽象。

答案 1 :(得分:2)

您不应该将HttpServletRequest / -Response作为服务层的一部分,因为HttpServletRequest / -Response是特定于您的用户界面/视图技术的类。 将它们引入您的服务层将使您的服务层依赖于用于用户界面的技术,从而使以后更难以更改UI / View技术。