2015-12-17 4 views
0

У меня есть проект, в котором я использовал аннотацию @Autowired. У меня есть конечные точки, службы и репозитории. Кроме того, я хотел создать javax.servlet.Filter, чтобы поставить фильтр перед ним. Все работает, кроме фильтра.Почему в этой конкретной ситуации autowiring null?

Мой код выглядит так:

(фильтр)

package com.mysportslife.web.auth; 

<import> 

@Provider 
@Component 
public class TokenFilter implements Filter { 

@Autowired 
private UserService userService; 

@Autowired 
private TokenService tokenService; 
.... 
.... 

(TokenService)

package com.mysportslife.web.auth; 
<import> 

@Service 
public class TokenService { 

@Autowired 
private UserService userService; 
.... 
.... 

(UserService)

package com.mysportslife.services; 

<import> 


@Service 
public class UserService { 

@Autowired 
private UserRepository userRepository; 
.... 
.... 

(web.xml)

<web-app xmlns:javaee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
<display-name>mysportslife</display-name> 
<description>Backend for MySportslife</description> 

<servlet> 
    <servlet-name>jersey-servlet</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>com.mysportslife.web</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>jersey-servlet</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 
<filter> 
    <filter-name>TokenFilter</filter-name> 
    <filter-class>com.mysportslife.web.auth.TokenFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>TokenFilter</filter-name> 
    <url-pattern>/rest/*</url-pattern> 
</filter-mapping> 

<!-- Algemene configuratie --> 
<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     classpath:ApplicationContext.xml 
    </param-value> 
</context-param> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

(applicationContext.xml)

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-2.5.xsd"> 

<context:component-scan base-package="com.mysportslife"/> 
<import resource="ApplicationContext-persistence.xml"/> 

</beans> 

Кто-нибудь имеет представление о том, почему UserService и tokenservice фильтр равны нулю?

Если вам нужна дополнительная информация, просто скажите мне. Заранее спасибо!

ответ

3

Это потому, что этот объект не инициализирован с помощью Spring. Для того, чтобы получить весной autowire ваших бобов вам нужно (супер простую версию):

  • экземпляра autowired боба с помощью Spring
  • instansiate в бобе вы проводка бобов в через Spring.

В вашем случае второе условие не выполняется.

Более подробное описание можно найти здесь:

DelegatingFilterProxy explained

+0

Что вы имеете в виду в с помощью Spring? Где я его не хватает? – ProCx

+0

Я добавил дополнительную ссылку. Прочитайте все это, и вы поймете, что не так. –

+0

заработал. Отправка ответа с результатом для других. Спасибо! – ProCx

0

Ответ действительно DelegatingFilterProxy. (Спасибо Gergely Баско) ..

Мой фильтр в web.xml выглядит следующим образом, и она работает:

<filter> 
    <filter-name>tokenFilter</filter-name> 
    <filter-class> org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>tokenFilter</filter-name> 
    <url-pattern>/rest/*</url-pattern> 
</filter-mapping> 
Смежные вопросы