【问题标题】:Could not resolve parameter [0] in exception error无法解析异常错误中的参数 [0]
【发布时间】:2023-03-27 19:08:01
【问题描述】:

我想在服务层抛出异常:

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

    if (cellValuesOfTheRow.contains(null)) {
        throw new NullFieldValueException(currentRowNumber);
    }

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

我做了一个自定义例外:

public class NullFieldValueException extends RuntimeException {

    private static final long serialVersionUID = -8460356990632230194L;

    int currentRowNumber;

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

}

我还有控制器建议:

@RestControllerAdvice
public class GenericExceptionHandler {

    @Autowired
    private MessageSource messageSource;

    @ExceptionHandler(NullFieldValueException.class)
    public ResponseEntity<ErrorResponse> handle(int currentRowNumber, Locale locale) {

        String errorMessage =
                messageSource.getMessage(
                "error.null.field.value" , new Object[]{currentRowNumber},locale);

        ErrorResponse error = new ErrorResponse();
        error.setErrorCode(HttpStatus.NOT_ACCEPTABLE.value());
        error.setMessage(errorMessage);

        return new ResponseEntity<>(error, HttpStatus.NOT_ACCEPTABLE);
    }
}

这是来自 messages/messages_en.properties

#nullpointer
error.null.field.value=Empty or null value for the row number: {0}

这是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;
    }
}

但它给出了错误:

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 

那么controlleradvice和自定义异常一起使用有错吗?

【问题讨论】:

    标签: java spring exception controller


    【解决方案1】:

    您的 ExceptionHandler 期望抛出的异常作为第一个参数,而不是 int currentRowNumber:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      • 2014-09-09
      • 2020-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多