【问题标题】:Using HttpServletRequest in Spring Service Layer在 Spring 服务层中使用 HttpServletRequest
【发布时间】:2016-06-12 14:22:27
【问题描述】:

环境:

Spring MVC 3

角度 JS

雄猫 6

问题:

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

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

struts2 动作中的业务逻辑被移到服务类中。

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

两个可用的选项是:

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

public ProductDto getProductDetails(HttpServletRequest req,int productId)

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

2) 使用 Spring 提供的 API:

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

请指导一下?

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    除了上述选项之外,您还可以在服务层中引入一个类或其他抽象,然后使用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);
    }
    

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

    【讨论】:

    • 如果我们想要更精细地访问请求对象,例如获取/设置请求/会话属性,那么上述方法将很困难
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-06-26
      • 2020-08-20
      • 2023-04-09
      • 1970-01-01
      • 2023-03-29
      • 2013-05-16
      • 2013-10-25
      • 1970-01-01
      相关资源
      最近更新 更多