2016-03-23 11 views
0

私は春のブート1.3.3アプリケーションを持っています。私は特定の状況で例外をスローするレストコントローラを持っています。例外がスローされ、メッセージが表示されますが、ControllerAdviceクラスは起動されていません。ここに私の関連ファイルです: TestController.javaControllerContvice例外処理なし

@Controller 
public class TestController { 
    // RESTful method 
    @RequestMapping(
      value = "/test", 
      method = RequestMethod.POST, 
      consumes = "application/json", 
      produces = "application/json") 
    @ResponseBody 
    public JsonNode fooRestTest(@RequestHeader HttpHeaders header, 
      @RequestBody String payload) { 
     ControllerUtil.validateHeaders(header); 
     return null; 
    } 
} 

ControllerUtil.java

public class ControllerUtil { 
    public static void validateHeaders(HttpHeaders headers) { 
     if(headers.get("test-field") == null) { 
      throw new InvalidHeaderException("Invalid test-field in header"); 
     } 
    } 
} 

InvalidHeaderException.java

public class InvalidHeaderException extends RuntimeException { 


    public InvalidHeaderException(String message) { 
     super(message); 
    } 

    public InvalidHeaderException(String message, Throwable cause) { 
     super(message, cause); 
    } 
} 

AppErrorController.java

@ControllerAdvice 
@EnableWebMvc 
public class AppErrorController { 

    @ExceptionHandler(InvalidHeaderException.class) 
    public ModelAndView handleHeaderError(HttpServletRequest req, Exception ex) { 
     ModelAndView mav = new ModelAndView(); 
     mav.addObject("exception", ex); 
     mav.addObject("url", req.getRequestURL()); 
     mav.addObject("timestamp", LocalDateTime.now()); 
     mav.addObject("status", 400); 
     return mav; 
    } 
} 

web.xmlの

<web-app id="RBGApp" version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 

    <display-name>FooTester</display-name> 

    <servlet> 
     <servlet-name>Foo_Test</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <!-- Mappings --> 
    <servlet-mapping> 
     <servlet-name>Foo_Test</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

</web-app> 

MvcConfiguration.java

@Configuration 
@EnableWebMvc 
public class MvcConfiguration extends WebMvcConfigurerAdapter { 
    @Autowired 
    ServletContext servletContext; 

    @Override 
    public void configureDefaultServletHandling(
      DefaultServletHandlerConfigurer configurer) { 
     configurer.enable(); 
    } 

    @Bean 
    public ViewResolver getJspViewResolver() { 
     InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 
     resolver.setPrefix("WEB-INF/jsp/views/"); 
     resolver.setSuffix(".jsp"); 
     resolver.setOrder(1); 
     return resolver; 
    } 
} 

私は郵便配達からのリクエストでこれをテストし、それが例外をスローし、ラインアウト出力します

Invalid test-field in header 

しかし、コードをAppErrorControllerには絶対に入りません。したがって、timestampのような他の値は入力されません。私はここで間違って何を考えている?

編集1: これは、応答として出してくれるものを郵便配達です:

<html> 
    <head> 
     <title>Apache Tomcat/7.0.62 - Error report</title> 
     <style> 
      <!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--> 
     </style> 
    </head> 
    <body> 
     <h1>HTTP Status 500 - Invalid test-field in header</h1> 
     <HR size="1" noshade="noshade"> 
     <p> 
      <b>type</b> Exception report 
     </p> 
     <p> 
      <b>message</b> 
      <u>Invalid test-field in header</u> 
     </p> 
     <p> 
      <b>description</b> 
      <u>The server encountered an internal error that prevented it from fulfilling this request.</u> 
     </p> 
     <p> 
      <b>exception</b> 
      <pre>controllers.exceptions.InvalidHeaderException: Invalid test-field in header 
    controllers.util.ControllerUtil.validateHeaders(ControllerUtil.java:12) 
    controllers.TestController.fooRestTest(TestController.java:77) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:497) 
    org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) 
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737) 
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:969) 
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:871) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:650) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:845) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    org.springframework.boot.context.web.ErrorPageFilter.doFilter(ErrorPageFilter.java:120) 
    org.springframework.boot.context.web.ErrorPageFilter.access$000(ErrorPageFilter.java:61) 
    org.springframework.boot.context.web.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:95) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    org.springframework.boot.context.web.ErrorPageFilter.doFilter(ErrorPageFilter.java:113) 
</pre> 
     </p> 
     <p> 
      <b>note</b> 
      <u>The full stack trace of the root cause is available in the Apache Tomcat/7.0.62 logs.</u> 
     </p> 
     <HR size="1" noshade="noshade"> 
     <h3>Apache Tomcat/7.0.62</h3> 
    </body> 
</html> 

編集2:コンソール出力郵便配達依頼

09:08:14.373 [http-bio-8080-exec-1] DEBUG org.springframework.web.servlet.DispatcherServlet - DispatcherServlet with name 'Foo_Test' processing POST request for [/TEST] 
09:08:14.381 [http-bio-8080-exec-1] DEBUG org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Looking up handler method for path /test 
09:08:14.390 [http-bio-8080-exec-1] DEBUG org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Returning handler method [public com.fasterxml.jackson.databind.JsonNode controllers.AlertController.getAlertsForRest(org.springframework.http.HttpHeaders,java.lang.String)] 
09:08:14.390 [http-bio-8080-exec-1] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'alertController' 
09:08:14.426 [http-bio-8080-exec-1] DEBUG org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor - Read [class java.lang.String] as "application/json" with [[email protected]32b26d] 
09:08:14.436 [http-bio-8080-exec-1] DEBUG org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver - Resolving exception from handler [public com.fasterxml.jackson.databind.JsonNode controllers.AlertController.getAlertsForRest(org.springframework.http.HttpHeaders,java.lang.String)]: controllers.exceptions.InvalidHeaderException: Invalid test-field in header 
09:08:14.439 [http-bio-8080-exec-1] DEBUG org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver - Resolving exception from handler [public com.fasterxml.jackson.databind.JsonNode controllers.AlertController.getAlertsForRest(org.springframework.http.HttpHeaders,java.lang.String)]: controllers.exceptions.InvalidHeaderException: Invalid test-field in header 
09:08:14.439 [http-bio-8080-exec-1] DEBUG org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Resolving exception from handler [public com.fasterxml.jackson.databind.JsonNode controllers.AlertController.getAlertsForRest(org.springframework.http.HttpHeaders,java.lang.String)]: controllers.exceptions.InvalidHeaderException: Invalid test-field in header 
09:08:14.443 [http-bio-8080-exec-1] DEBUG org.springframework.web.servlet.DispatcherServlet - Could not complete request 
controllers.exceptions.InvalidHeaderException: Invalid test-field in header 
    controllers.util.ControllerUtil.validateHeaders(ControllerUtil.java:12) 
    controllers.TestController.fooRestTest(TestController.java:77) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:222) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:969) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:871) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:845) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.springframework.boot.context.web.ErrorPageFilter.doFilter(ErrorPageFilter.java:120) 
    at org.springframework.boot.context.web.ErrorPageFilter.access$000(ErrorPageFilter.java:61) 
    at org.springframework.boot.context.web.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:95) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.boot.context.web.ErrorPageFilter.doFilter(ErrorPageFilter.java:113) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 
+0

...ログステートメントを追加してそれを再確認できますか?設定がうまくいくように見えます。 –

+0

マイ・ポストを更新しました。あなたが見ることができるように、ControllerAdviceはこの応答に全く寄与しません。タイムスタンプフィールドがあり、エラーコードは400でなければなりません。 – Richard

+0

そのコントローラから '@ EnableWebMvc'アノテーションを削除して、もう一度やり直すことができます。あなたはどこかのプロジェクト(Bitbucket、GitHub、GitLab)を持っていますか?また、 'viewName'を決して決して決してどこに行くのかわからない... –

答えて

0

を作るとき、あなたがメッセージを持っていますかあなたのログファイルにjava.lang.IllegalStateException: No suitable resolver for argumentのように?代わりに例外InvalidHeaderException

handleHeaderErrorメソッドの引数で、同じ例外の型を使用してみてください。このように:

@ControllerAdvice 
@EnableWebMvc 
public class AppErrorController { 

@ExceptionHandler(InvalidHeaderException.class) 
public ModelAndView handleHeaderError(HttpServletRequest req, InvalidHeaderException ex) { 
    ModelAndView mav = new ModelAndView(); 
    mav.addObject("exception", ex); 
    mav.addObject("url", req.getRequestURL()); 
    mav.addObject("timestamp", LocalDateTime.now()); 
    mav.addObject("status", 400); 
    return mav; 
} 

}

+0

私もこれを試してみましたが、それでも動作しませんでした。私はコンソール出力を掲示した。 'IllegalStateException'はスローされません。 – Richard

0

この要求(from first 5 lines of console output)を処理している他のいくつかのハンドラがありますように。これは、プロジェクトの構築パスにある任意のジャーにある可能性があります。

ハンドラーの優先度を「高」に設定する必要があるため、ここでは制御が優先されます。

@EnableWebMvcの後に@Order(Ordered.HIGHEST_PRECEDENCE)を追加すると問題が解決する可能性があります。

@ControllerAdvice 
@EnableWebMvc 
@Order(Ordered.HIGHEST_PRECEDENCE) 
public class AppErrorController { 

@ExceptionHandler(InvalidHeaderException.class) 
public ModelAndView handleHeaderError(HttpServletRequest req, InvalidHeaderException ex) { 
    ModelAndView mav = new ModelAndView(); 
    mav.addObject("exception", ex); 
    mav.addObject("url", req.getRequestURL()); 
    mav.addObject("timestamp", LocalDateTime.now()); 
    mav.addObject("status", 400); 
    return mav; 
} 

また、それは(関係なく、それはコントロールがここに来る何であるかの例外の)InvalidHeaderException.classException.classにを変更してみてください動作しない場合。あなたの場合でもデバッグが役に立ちます。