2016-06-12 4 views
0

Окружающая среда:Использование HttpServletRequest в Spring Service Layer

Spring MVC 3

Угловой JS

Tomcat 6

Выпуск:

Мы миграции устаревших приложений от struts2 до spring MVC REST с угловым JS как пользовательский интерфейс. Это типичный SPA.

Типичный поток приложения: контроллер Угловая JS + Spring REST + Service слой

Бизнес-логика Struts2 действий перемещается на классы обслуживания.

Мой вопрос - Каков правильный способ сделать объект HttpServetRequest доступным для классов обслуживания весной?

два варианта доступны:

1) Pass HttpServletRequest методу контроллера Spring MVC. Пройдите то же самое HttpServetRequest до уровня обслуживания Spring. Но это приведет к HttpServletRequest быть частью интерфейса обслуживания, как -

public ProductDto getProductDetails(HttpServletRequest req,int productId) 

Является ли это правильный путь? Может ли HttpServletRequest быть частью сервисного интерфейса?

2) Использование Spring предусмотрено API:

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

Пожалуйста, руководство по этому вопросу?

ответ

3

В дополнение к указанным вариантов, вы можете ввести класс или другую абстракцию в ваш сервисный уровень, а затем заполнить его необходимыми частями HttpServletRequest и использовать эту абстракцию внутри слоя службы.

Например (заимствованным из Spring Data) Предположим, что вы хотите получить доступ к page, size и sort и связанные с пользователем строки запроса из HttpServletRequest. Вместо передачи запроса к методам обслуживания слоя, вы можете инкапсулировать эти параметры в абстракцию, скажем, Pageable или UserFilterCriteria:

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

Таким образом, вы можете легко определить абстракции I n тот же уровень абстракции, что и ваш сервисный уровень.

+0

Если мы хотим получить более тонкий доступ к зерну для запроса объекта, например, получить/задать запрос/сеансовые атрибуты, тогда подход выше будет достаточно – Atul

1

Вы не должны делать HttpServletRequest/-Response частью вашего уровня обслуживания, так как HttpServletRequest/-Response являются классами, специфичными для вашей технологии пользовательского интерфейса/просмотра. Представляя их на уровне обслуживания, ваш уровень обслуживания будет зависеть от технологии, используемой для пользовательского интерфейса, что затрудняет изменение технологии UI/View позже.