Как получить HttpServletRequestObject в классе @service - PullRequest
3 голосов
/ 15 июня 2011

Я успешно могу интегрировать Spring и Spring4GWT. Все работает нормально.

Единственная проблема, с которой я сталкиваюсь, это как получить HttpServletRequestObject в классе @service?

Некоторые настройки и код

web.xml

<servlet>
        <servlet-name>test</servlet-name>
        <servlet-class>org.spring4gwt.server.SpringGwtRemoteServiceServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>test</servlet-name>
        <url-pattern>/ui/test/*</url-pattern>
    </servlet-mapping>

Класс обслуживания

public class LoginServiceImpl implements ILoginService {

    private IUserService userService;
    public LoginServiceImpl(IUserService userService) {
        super();
        this.userService = userService;
    }

    public boolean isAuthenticUser(String userName, String password) {
        // operation
    }
}

В LoginServiceImpl Я не могу получить объект Servlet. Мне нужно здесь, чтобы я мог использовать его для разных целей.

Есть идеи?

Ответы [ 4 ]

4 голосов
/ 16 июня 2011

Наконец-то у меня есть решение. Если кто-то хочет получить доступ к HttpServletrequest в службе GWT-RPC, то может помочь следующее:

Изменить web.xml

<filter>
    <filter-name>springRequestFilter</filter-name>
    <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>springRequestFilter</filter-name>
    <url-pattern>/your_pattern/*</url-pattern>
</filter-mapping>

В эксплуатации

ServletRequestAttributes sra = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes());
sra.getRequest();

Надеюсь, это полезно

2 голосов
/ 15 июня 2011

С точки зрения дизайна, you should NOT have a HttpServletRequest object in your service layer.Вместо этого извлекайте необходимую информацию из запроса и передавайте ее в качестве параметров на уровень обслуживания.

Пожалуйста, расскажите подробнее о том, что вы пытаетесь сделать, и зачем вам нужен объект HttpServletRequest на вашем уровне обслуживания.

В противном случае ваша иерархия зависимостей будет иметь цикл.Уровень представления в зависимости от уровня обслуживания и уровня обслуживания в зависимости от уровня представления.

1 голос
/ 18 июня 2017

Существует также альтернативное решение, которое может пригодиться, когда вам также нужно HttpServletResponse.

Проще говоря:

  • заставит ваши ServiceImpl классы расширяться org.spring4gwt.server.SpringGwtRemoteServiceServlet(Вы должны сделать это в любом случае)
  • затем измените SpringGwtRemoteServiceServlet#getBean(), чтобы вернуть this объект
  • this будет экземпляром вашего ServiceImpl, расширяющего SpringGwtRemoteServiceServlet до тех пор, покаваш web.xml ссылается на ваш ServiceImpl, а не на Spring4GWT напрямую.Это также стандартный способ GWT, вы даже можете автоматизировать его с помощью @RemoteServiceRelativePath.
  • , вы также хотите запустить сервлет (объект this сверху) через SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this), чтобы получитьваше внедрение зависимостей выполнено
  • таким образом, ваш ServiceImpl также будет сервлетом, отвечающим на запрос, и сможет получить доступ к getThreadLocalRequest () из родительского класса

Это не так глупо, как кажется.По сути, GWT хочет, чтобы ваши классы обслуживания были сервлетами, а Spring4GWT - чтобы они были стандартными компонентами Spring.Этот подход находится где-то посередине.

1 голос
/ 15 июня 2011

Вам необходимо передать HttpServletRequest от вашего контроллера в метод обслуживания (например, в качестве параметра метода).

В любом случае:

  • ваш метод обслуживания должен абстрагироваться от таких вещей, как httpServletRequestObject,Эта абстракция обычно выполняется в (веб) контроллере.
  • похоже, что вы заново изобретаете средства безопасности, взглянули ли вы на Spring Security ?
...