2017-10-18 8 views
-1

In meinem Frühling Anwendung verwende ich die LinieAutowired funktioniert nicht in AbstractHttpMessageConverter

@Autowired 
private transient EntityService entityService; 

an einigen Stellen erfolgreich zu bekommen, die EntityService zu bekommen. Aber nicht so in dem AbstractHttpMessageConverter schreibe ich CSV-Antworten geben (die in der Regel funktioniert)

public class SearchResultCsvConverter extends AbstractHttpMessageConverter<SearchResult> { 

    public SearchResultCsvConverter() { 
     super(new MediaType("text", "csv")); 
    } 

    @Autowired 
    private transient EntityService entityService; 

Anmeldung:

@ComponentScan(...) 
@Configuration 
@EnableWebMvc 
@EnableAsync 
@EnableTransactionManagement 
@EnableSpringConfigured 
@PropertySource("classpath:config/application.properties") 
public class ApplicationConfiguration extends WebMvcConfigurerAdapter { 

    @Inject 
    private Environment environment; 

    @Autowired 
    private transient EntityService entityService; 

    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     converters.add(new SearchResultCsvConverter()); 
    } 

Die SearchResultCsvConverter als solche Werke, auch sind EntityService in den ApplicationConfiguration, aber in SearchResultCsvConverter es ist null. Irgendwelche Hinweise, wo ich den Fehler finden könnte oder worauf ich achten muss, werden sehr geschätzt!

Ich benutze Frühling 4.3.4.

- bearbeiten 1

Ich versuchte @Service für die SearchResultCsvConverter auch - gleiches Ergebnis.

- bearbeiten 2: Lösung dank @Radu Pop

public class ApplicationConfiguration extends WebMvcConfigurerAdapter { 

    @Inject 
    private Environment environment; 

    @Autowired 
    private transient EntityService entityService; 

    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     final SearchResultCsvConverter searchResultCsvConverter = new SearchResultCsvConverter(); 
     searchResultCsvConverter.setEntityService(entityService); 
     converters.add(searchResultCsvConverter); 

und im Konverter

private transient EntityService entityService; 

public SearchResultCsvConverter() { 
    super(new MediaType("text", "csv")); 
} 

public void setEntityService(EntityService entityService) { 
    this.entityService = entityService; 
} 

mir Sieht nicht so elegant, aber funktioniert gut.

Antwort

0

Wie ich aus Ihrem Code ersehen kann, wird die von Ihnen geschriebene Konverterklasse im Zusammenhang mit der Quellanwendung nicht als Bean betrachtet. Dies liegt daran, dass die Liste selbst, die in Ihrer Anwendungskonfigurationsklasse definiert ist, eine Bean ist, aber nicht die Elemente, aus denen sie stammt.

Daher haben Sie die Möglichkeit, den einfachen Konverter auch als Bean zu betrachten. Sie können dies tun, indem Sie @Configurable approach verwenden, aber Sie müssen Spring-AOP-Möglichkeiten aktivieren, oder Sie können einfach in Ihrer Anwendungskonfigurationsklasse eine Methode erstellen, die eine Bean dieses Typs zurückgibt und die Instanziierung dort ausführt. Diese Methode wird in der zurückgegeben, die die Liste zurückgibt, um die Konverter mit Ihrer benutzerdefinierten Bean ordnungsgemäß zu füllen.

+0

Vielen Dank Ich habe die letztere Lösung verwendet. – Paflow

Verwandte Themen