无法解析异常错误中的参数 [0]

Can*_*dın 1 java spring controller exception

我想在服务层抛出异常:

    List<String> cellValuesOfTheRow = getColumnValuesForRow(row, false);
    logger.info("currentRowNumber: {}, cellValuesOfTheRow: {}", currentRowNumber, cellValuesOfTheRow);

    if (cellValuesOfTheRow.contains(null)) {
        throw new NullFieldValueException(currentRowNumber);
    }
Run Code Online (Sandbox Code Playgroud)

如果该列表包含空值,我希望它抛出异常。

我做了一个自定义例外:

public class NullFieldValueException extends RuntimeException {

    private static final long serialVersionUID = -8460356990632230194L;

    int currentRowNumber;

    public NullFieldValueException(int currentRowNumber) {
        super();
        this.currentRowNumber = currentRowNumber;
    }

}
Run Code Online (Sandbox Code Playgroud)

我也有控制器建议:

    List<String> cellValuesOfTheRow = getColumnValuesForRow(row, false);
    logger.info("currentRowNumber: {}, cellValuesOfTheRow: {}", currentRowNumber, cellValuesOfTheRow);

    if (cellValuesOfTheRow.contains(null)) {
        throw new NullFieldValueException(currentRowNumber);
    }
Run Code Online (Sandbox Code Playgroud)

这是来自messages/messages_en.properties

#nullpointer
error.null.field.value=Empty or null value for the row number: {0}
Run Code Online (Sandbox Code Playgroud)

这是messageconfig

@Configuration
public class MessageConfig {

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource
                = new ReloadableResourceBundleMessageSource();

        messageSource.setBasename("classpath:messages/messages");
        messageSource.setDefaultEncoding("UTF-8");
        messageSource.setUseCodeAsDefaultMessage(true);

        return messageSource;
    }

    @Bean
    public LocalValidatorFactoryBean getValidator() {
        LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
        bean.setValidationMessageSource(messageSource());

        return bean;
    }
}
Run Code Online (Sandbox Code Playgroud)

但它给出了错误:

java.lang.IllegalStateException: Could not resolve parameter [0] in public org.springframework.http.ResponseEntity<com.example.demo.response.ErrorResponse> com.example.demo.config.GenericExceptionHandler.handle(java.lang.String,java.util.Locale): No suitable resolver
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:164) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:407) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:61) [spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:141) [spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:80) [spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1300) [spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1111) [spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) [spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) [spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) [spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) [spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at 
Run Code Online (Sandbox Code Playgroud)

那么将controlleradvice和自定义异常一起使用是错误的吗?

Mic*_*iel 6

您的 ExceptionHandler 期望抛出的 Exception 作为第一个参数,而不是intcurrentRowNumber:

@ExceptionHandler(NullFieldValueException.class)
public ResponseEntity<ErrorResponse> handle(NullFieldValueException e, Locale locale) {
   int rowNumber = e.getCurrentRowNumber();
   ...
}
Run Code Online (Sandbox Code Playgroud)

getCurrentRowNumber()在您的异常类中添加一个 getter来检索行号。