簡體   English   中英

在Spring Service Layer中使用HttpServletRequest

[英]Using HttpServletRequest in Spring Service Layer

環境 :

春季MVC 3

角JS

雄貓6

問題 :

我們正在將舊版應用程序從struts2遷移到以angular JS作為UI的spring MVC REST 這是典型的SPA。

典型的應用程序流程是:Angular JS + Spring REST控制器+服務

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借來的),假設您想從HttpServletRequest訪問pagesizesort以及與用戶相關的查詢字符串。 除了將請求傳遞給服務層方法之外,您還可以將這些參數封裝到一個抽象中,例如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);
}

這樣,您可以輕松地在與服務層相同的抽象級別上定義抽象。

您寧可不要使HttpServletRequest / -Response成為服務層的一部分,因為HttpServletRequest / -Response是特定於用戶界面/視圖技術的類。 將它們引入您的服務層將使您的服務層取決於用於用戶界面的技術,因此使以后更改UI / View技術變得更加困難。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM