2017-01-10 20 views
1

我想處理@ControllerAdvice類中的所有控制器異常,但是當捕獲BindException時,找不到根異常。如何在@ExceptionHandler中獲取BindException的根異常

這裏是我的代碼:

控制器:

@PostMapping 
public ResponseEntity<UserDto> add(@Valid UserDto user) { 
    return ResponseEntity.ok(user); 
} 

UserDto:

public class UserDto { 

    private String name; 
    private Gender gender; 

    /*setter and getter*/ 
} 

性別:

public enum Gender { 

    FEMALE, MALE 
} 

轉換器:

@Component 
public class GenderConverter implements Converter<String, Gender> { 

    @Override 
    public Gender convert(String source) { 
     try { 
      return Gender.valueOf(source.toUpperCase()); 
     } catch (IllegalArgumentException e) { 
      throw new IllegalArgumentException("Unknown gender value \"" + source + 
        "\", gender value should be [female, male]"); 
     } 
    } 
} 

當我張貼性別= M,有異常消息:

org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors 
Field error in object 'userDto' on field 'gender': rejected value [m]; codes [typeMismatch.userDto.gender,typeMismatch.gender,typeMismatch.org.tings.learning.spring.mvc.model.Gender,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userDto.gender,gender]; arguments []; default message [gender]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'org.tings.learning.spring.mvc.model.Gender' for property 'gender'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull org.tings.learning.spring.mvc.model.Gender] for value 'm'; nested exception is java.lang.IllegalArgumentException: Unknown gender value "m", gender value should be [female, male]] 
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:118) 
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) 
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:160) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:129) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:116) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670) 
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2508) 
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2497) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
+0

使用的java.lang.Throwable#的getCause – popalka

+2

** **什麼'BindException' ?您發佈的代碼或輸出中沒有任何此類事物。 – EJP

+0

@SurenSrapyan編輯被拒絕。不要使用引號格式來表示未引用的文本,並且對代碼或計算機輸出的文本使用代碼格式,因爲OP已經做到了。正確。 – EJP

回答

0
+0

沒有真正的根異常,但BindException的默認消息包含嵌套異常 – Robinson

+0

您是否嘗試過http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/validation/BindException.html# getFieldErrors--? –

+0

我試過了,但沒有找到 – Robinson

1

根據文檔,我建議您閱讀BeanPropertyBindingResult如下:

默認實現的Errors和BindingResult接口, 註冊和評估JavaBean對象的綁定錯誤。

執行標準的JavaBean屬性訪問,也支持嵌套的 屬性。通常,應用程序代碼將與接口或BindingResult接口的錯誤 一起使用。 DataBinder通過DataBinder.getBindingResult()返回它的 BindingResult。

根據上面的描述,Spring驗證框架拋出這個錯誤,每當驗證失敗和類似的事情在你的代碼發生以及爲下包中定義Genderorg.tings.learning.spring.mvc.model您發送mSpring不能找到特定值Gender枚舉,並要求你給男性或女性作爲輸入:

按照錯誤日誌:

未能將類型[java.lang.String]轉換爲值爲'm'的 [@ javax.validation.constraints.NotNull org.tings.learning.spring.mvc.model.Gender];嵌套0​​例外是java.lang.IllegalArgumentException異常:未知性別值 「M」,性別值應爲[雌,雄]

相關問題