java - 在 Spring 服务层使用 HttpServletRequest

标签 java spring spring-mvc

环境:

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),假设你想访问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);
}

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

关于java - 在 Spring 服务层使用 HttpServletRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37775312/

相关文章:

java - 将 Json 数据绑定(bind)到条形图

java - 服务器端相当于 GWT 中的 Window.Location.getParameter()

java - org.apache.camel :camel-maven-plugin is missing (Windows 10)

java - 使用 spring boot 应用程序属性设置 tomcat 属性

Spring Boot camunda 单元测试 - 异步之前/之后

java - 如何定义aop :pointcut annotation in MultiActionController

java - 从 for 循环中的 if 退出 for 循环?

java - 如何从 RepositoryItemWriter 调用 SimpleJpaWriter 方法?

java - CAS 5.3 管理 - 发现多个名为 [spring_web] 的片段。这对于相对顺序来说是不合法的

java - URL 未连接到我的 Spring Boot 应用程序