2017-05-16 4 views
0

Ich habe eine Spring-Boot Anwendung. Ich habe eine Klasse, die ControllerAdvice ist, um die von der App ausgelösten Ausnahmen zu behandeln.SpringBoot - Filter Ausnahme Handler

Ich habe eine filter erstellt, die ich verwenden möchte, um eine Kopfzeile für alle meine Anfragen zu validieren. Wenn ich die benutzerdefinierte Ausnahmebedingung von diesem Filter abrufe, durchläuft sie nicht meine Ausnahmebehandlungsroutine, sondern verwendet das Standard-Spring-Fehlersteuerelement.

Gibt es eine Möglichkeit, die Fehler von Filtern auf meine eigene Weise zu behandeln?

+0

Bitte schreiben Sie den Code, wo Sie diesen Fehler werfen und wo Sie versuchen, es zu fangen. –

+1

Haben Sie versucht, Ihren 'ExceptionHandler' in Ihren Filter anstatt' ControllerAdvice' zu ​​schreiben? Weil die Anfrage möglicherweise Ihr DipatcherServlet nicht erreicht. – ansh

Antwort

1

Fügen Sie diese in Ihre application.properties:

spring.mvc.throw-exception-if-no-handler-found=true 
+0

Funktioniert nicht in spring.boot.version 1.3.3.RELEASE – JRichardsz

0

Sie einen Controller schreiben können, die BasicErrorController und schreiben Sie eine Methode, die eine @GetMapping Anmerkung wie dieser hat sich:

@RestController 
public class FilterExceptionController extends BasicErrorController { 

    private static final Logger LOGGER = LoggerFactory.getLogger(FilterExceptionController.class); 

    public FilterExceptionController(){ 
     super(new DefaultErrorAttributes(),new ErrorProperties()); 
    } 

    @GetMapping 
    private <T> ResponseResult<T> serviceExceptionHandler(HttpServletRequest request) { 
     Map<String,Object> body= getErrorAttributes(request,isIncludeStackTrace(request,MediaType.ALL)); 
     String message = String.valueOf(body.get("message")); 
     body.forEach((k,v)->LOGGER.info("{} ==> {}",k,v)); 
     return RestResultGenerator.genError(500,"Filter Error Occurred, Message: [ "+message+" ]"); 
    } 

    @Override 
    public String getErrorPath() { 
     return "/error"; 
    } 
} 

Es ist mein Testfilter:

@WebFilter(filterName = "ipFilter",urlPatterns = "/*") 
public class IpFilter implements Filter{ 
    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 

    } 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
     if(!Arrays.asList(new String[]{"127.0.0.1"}).contains(servletRequest.getRemoteAddr())){ 
      throw new ServiceException(403,"ip forbid"); 
     } 
    } 

    @Override 
    public void destroy() { 

    } 
} 

Thi s ist Ergebnis (aber nur Ausnahme Nachricht nicht Code erhalten): enter image description here

+0

und kann auch in Ihre Klasse mit '@ ControllerAdvice' kommentieren – user7456343

Verwandte Themen