2016-07-25 5 views
0

Ich habe ein seltsames Verhalten mit einer Spring Data Rest-Implementierung (Version 2.5.2.RELEASE).Spring Data Rest: ResourceProcessor-Konfiguration funktioniert nicht richtig

Ich versuche eine @Bean von ResourceProcessor<Resource<Entity>> zu registrieren, aber es ist etwas seltsam.

Ich bin mit zwei Arten von Lösungen versuchen:

1) die @Bean in einer Klasse deklarieren:

@Bean 
public ResourceProcessor<Resource<Author>> authorProcessor() { 

    return new ResourceProcessor<Resource<Author>>() { 

     @Override 
     public Resource<Author> process(Resource<Author> resource) { 

      System.out.println("method process of bean ResourceProcessor of class RepositoryBaseConfiguration"); 
      return resource; 
     } 
    }; 
} 

2) Implementierung der Schnittstelle ResourceProcessor:

@Component 
public class AuthorResourceProcessor implements ResourceProcessor<Resource<Author>> { 

    @Override 
    public Resource<Author> process(Resource<Author> resource) { 
     System.out.println("method process of class AuthorResourceProcessor"); 
     return resource; 
    } 

} 

Die Prozessoren ar e völlig ignoriert: die Nachricht wird nie gedruckt.

bemerkte ich, dass die Klasse org.springframework.data.rest.webmvc.ResourceProcessorInvoker einen Konstruktor hat:

public ResourceProcessorInvoker(Collection<ResourceProcessor<?>> processors) { 

    //... 
} 

Dieser Konstruktor 2 mal zu Beginn der Anwendung aufgerufen wird, statt nur einmal (wie ich erwartet wird), und ich verstehe nicht warum.

Beim ersten Mal wird die Variable "processors" mit den beiden Beans (wie erwartet) und mit der Bean org.springframework.data.rest.webmvc.ProfileResourceProcessor gelöst.

Aber das zweite Mal ist die Variable "Prozessoren" nur mit der Bean org.springframework.data.rest.webmvc.ProfileResourceProcessor gelöst.

Die zweite Konfiguration @Override die erste.

Irgendeine Idee?

Antwort

0

Das Problem hängt von den Konfigurationen ab, die beim Start der Anwendung geladen wurden.

hatte ich diese Konfiguration auf den web.xml:

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/spring/spring-web-config.xml</param-value> 
</context-param> 

<servlet> 
    <servlet-name>rest</servlet-name> 
    <servlet-class>org.springframework.data.rest.webmvc.RepositoryRestDispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

die ContextLoaderListener die richtige Konfiguration in der ersten Zeit geladen So; Die Eigenschaft "load-on-startup" des Servlets "RepositoryRestDispatcherServlet" startet eine zweite Kontextkonfigurationslast.

Ich hatte auch eine benutzerdefinierte Klasse, die org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration, aber diese benutzerdefinierte Klasse erweitert wurde von dem Moment ignoriert, dass der Konstruktor von RepositoryRestDispatcherServletLast des StandardRepositoryRestMvcConfiguration, die der Konfigurationen verloren verursacht.

Um dieses Problem zu lösen Ich habe ein benutzerdefinierte erstelltRepositoryRestDispatcherServlet auf diese Weise:

public class AppRepositoryRestDispatcherServlet extends DispatcherServlet { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    public AppRepositoryRestDispatcherServlet() { 
     configure(); 
    } 

    public AppRepositoryRestDispatcherServlet(WebApplicationContext webApplicationContext) { 
     super(webApplicationContext); 
     configure(); 
    } 

    private void configure() { 
     setContextClass(AnnotationConfigWebApplicationContext.class); 
     setContextConfigLocation(RepositoryBaseConfiguration.class.getName()); 
    } 

} 

Die Klasse die gleichen wie RepositoryRestDispatcherServlet, mit dem einzigen Unterschied besteht darin, dass in der setContextConfigLocation die Klasse benutzerdefinierten geben wird, die sich RepositoryRestMvcConfiguration (RepositoryBaseConfiguration in diesem Beispiel).

Offensichtlich hatte ich die web.xml wie folgt zu aktualisieren:

<servlet> 
    <servlet-name>rest</servlet-name> 
    <servlet-class>my.package.AppRepositoryRestDispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

Auf diese Weise wird die Konfiguration korrekt geladen und instand gehalten.

Verwandte Themen