2017-01-22 2 views
0

Ich weiß, dass dies viele Male gefragt worden, aber keiner von ihnen konnte meinen Code arbeiten. Ich könnte etwas falsch machen, aber ich kann nicht herausfinden, was.Spring Interceptions funktioniert nicht

Ich benutze Spring Boot mit AngularJS, was ich versuche zu tun ist, alle Anfragen zu erfüllen.

Dies ist mein Code:

Controller:

@RestController 
@RequestMapping(value = { "/user" }) 
public class UserController { 

    @RequestMapping(value = "/get", method = RequestMethod.GET) 
    public String getLanguage() { 
     return "user"; 
    } 
} 

Interceptor:

@Component 
public class RequestHandler extends HandlerInterceptorAdapter { 

    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException { 
     System.out.println("intercepted"); 
     return false; 
    } 
} 

WebConfig:

@Configuration 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Autowired 
    HandlerInterceptor requestHandler; 

    @Override 
    public void addInterceptors(InterceptorRegistry registry) { 
    registry.addInterceptor(requestHandler); 
    } 
} 

Und fügte ich dies dem applicationContext.xml:

Ich habe das ganze Wochenende versucht, diese Arbeit zu machen, und ich konnte nicht, jede Hilfe wird wirklich geschätzt werden!

Vielen Dank!

+0

Haben Sie versucht, den RequestHandler und nicht den allgemeinen HandlerInterceptor zu injizieren. Oder registriere deinen Interceptor mit registry.addInterceptor (new RequestHandler())? – Nathanael

+0

Ich habe das versucht, aber es funktioniert immer noch nicht. – Motomine

+0

Warum hast du sowohl xml als auch java config zum Einrichten von Spring MVC ... Das ist ein Problem mit dem Warten ... Auch ohne '@ EnableWebMvc' oder' 'sind diese Konfigurationen nicht zu viel, das gleiche gilt, wenn Sie manuell 'HandlerAdapter' und/oder' HandlerMapping' konfiguriert haben. –

Antwort

0

könnten Sie versuchen, die Bean manuell definieren, ohne Ihre Interceptor als eine @Component wie folgt erklärt:

RequestHandler.java

public class RequestHandler extends HandlerInterceptorAdapter { 

    @Override 
    public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler) throws ServletException { 
     System.out.println("intercepted"); 
     return true; 
    } 
} 

WebConfig.java

@Configuration 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Bean 
    public RequestHandler requestHandler() { 
     return new RequestHandler(); 
    } 

    @Override 
    public void addInterceptors(final InterceptorRegistry registry) { 
     registry.addInterceptor(requestHandler()); 
    } 
} 

Und übrigens: Wenn die Klasse als Interceptor deklariert wird, warum nicht zu etwas umbenennen, das den Begriff Interceptor in es wie RequestInterceptor enthält?

Es sollte einfach funktionieren. Bitte lass mich wissen, ob das für dich das Richtige ist!

Update: Ich habe dies in einem Prototyp implementiert. Sehen Sie sich dieses minimale, vollständige und überprüfbare Beispiel an. Ich hoffe es hilft! https://github.com/dbubenheim/stackoverflow-41794738.git

+0

Ich habe das versucht, aber sagt, dass es dort eine Bohne schaffen kann. Ich weiß nicht, was ich sonst noch tun kann, weil ich viele Dinge ausprobiert habe. Darf ich etwas in der web.xml einstellen? Da meins leer ist, habe ich versucht, das Servlet-Mapping dort zu setzen, aber es sagt, dass es deklariert werden kann oder so ähnlich. – Motomine

+0

Ich habe meine Antwort aktualisiert und ein minimales Beispiel hinzugefügt. Vielleicht haben Sie die Zeit zu überprüfen, ob es für Sie funktioniert. –

+0

Auch muss ich erwähnen, dass der Rückgabewert der 'preHandle' Methode" wahr "sein sollte, um die Request-Handler-Chain zu vervollständigen und Ihre Controller-Methode zu erreichen. Bitte schauen Sie sich auch @Motomine –

Verwandte Themen