@Autowired не работает в EndpointInterceptor - PullRequest
0 голосов
/ 16 января 2019

У меня есть пользовательская реализация EndpointInterceptor;

@Component
public class MyEndpointInterceptor implements EndpointInterceptor {

@Autowired
private Jaxb2Marshaller marshaller;

@Override
public boolean handleRequest(MessageContext messageContext, Object o) throws Exception {
    return true;
}

@Override
public boolean handleResponse(MessageContext messageContext, Object o) throws Exception {
    return true;
}

@Override
public boolean handleFault(MessageContext messageContext, Object o) throws Exception {
    return true;
}

@Override
public void afterCompletion(MessageContext messageContext, Object o, Exception e) throws Exception {
    // ... do stuff with marshaller
}
}

Перехватчик добавлен в класс конфигурации, который расширяет WsConfigurerAdapter;

@Configuration
@EnableWs
public class MyWebServiceConfiguration extends WsConfigurerAdapter {
     @Bean(name = "marshaller")
     public Jaxb2Marshaller createJaxb2Marshaller() {
       Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
       return marshaller;
     }
     @Override
    public void addInterceptors(List<EndpointInterceptor> interceptors) 
    {
        // Register interceptor
        interceptors.add(new MyEndpointInterceptor());
    }
}

но объект marshaller равен null.

Есть ли что-то, чего мне не хватает в этот момент?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Ваша проблема в том, что вы не позволяете Spring управлять MyEndpointInterceptor. При использовании Spring вы не должны использовать конструктор напрямую. Но пусть Spring соберет для вас боб.

Ваш конфиг должен выглядеть так:

@Configuration
@EnableWs
public class MyWebServiceConfiguration extends WsConfigurerAdapter {
    @Bean(name = "marshaller")
    public Jaxb2Marshaller createJaxb2Marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        return marshaller;
    }

    @Autowired
    private MyEndpointInterceptor myEndpointInterceptor;

    @Override
    public void addInterceptors(List<EndpointInterceptor> interceptors)
    {
        // Register interceptor
        interceptors.add(myEndpointInterceptor);
    }
}
0 голосов
/ 16 января 2019

Если вы используете Constructor Injection вместо Field Injection, вы, вероятно, получите довольно полезное исключение, я могу только догадываться, но кажется, что у Spring нет Marshaller в контексте Spring, поэтому вам нужно где-то предоставить метод @Bean, например

@Bean
public Jaxb2Marshaller jaxb2Marshaller () {
 return new Jaxb2Marshaller(foo, bar, ..);
}

Вы можете прочитать здесь, почему вам следует избегать инъекции поля: https://www.vojtechruzicka.com/field-dependency-injection-considered-harmful/

...