Java 如何使Spring转换器抛出自定义异常而不是ConversionFailedException?

Java 如何使Spring转换器抛出自定义异常而不是ConversionFailedException?,java,spring,spring-mvc,spring-boot,converter,Java,Spring,Spring Mvc,Spring Boot,Converter,我的代码库中有一堆定制的spring转换器,比如: public class ElasticSearchConverter implements Converter<RequestModel, ResponseModel> { @Override public final ResponseModel convert(RequestModel requestModel) { if(!requestModel.isValid()) { throw new El

我的代码库中有一堆定制的spring转换器,比如:

public class ElasticSearchConverter implements Converter<RequestModel, ResponseModel> {
  @Override
  public final ResponseModel convert(RequestModel requestModel) {
    if(!requestModel.isValid()) {
      throw new ElasticSearchException("Request Model is not valid");
    }

    ... Implement converter
  }
}
我的问题是,当我在
ElasticSearchConverter
中抛出
ElasticSearchException
时,它在spring
ConversionUtils
类中被捕获,并转换为
conversionfailedeexception
。我想捕获我在转换器中抛出的特定
ElasticSearchException


如何从我的服务类中的spring
Converter
类捕获特定异常?

您需要实现将处理异常的类

@ControllerAdvice
public class ExceptionTranslator {


    @ExceptionHandler(ConversionFailedException.class) //handle your Exception
    @ResponseStatus(HttpStatus.BadRequest) // Define the status you want to return
    @ResponseBody
    public ErrorDTO processElasticSearchException(ConversionFailedException ex) {
        return new ErrorDTO(); 
        /* Format your response as you need*/
    }
}
@ControllerAdvice
“带有(注释)的类可以显式声明为Springbean或通过类路径扫描自动检测”
@ExceptionHandler
定义要捕获的异常
@ResponseStatus
定义http响应状态
@ResponseBody
将响应自动序列化为json对象

对于我的项目,我定义了一个ErrorDTO来格式化响应,您也可以这样做,您只需构造对象并返回它

您还可以将要执行的代码放入此方法中,并在需要时引发另一个异常

您可以编写一个简单的适配器类来包装Spring ConversionService。在该类中,您将拥有一个convert()方法,该方法在try/catch中委托给包装好的ConversionService方法,捕获conversionfailedeexception,检查它(例如,使用getRootCause())并将rethrow作为您选择的异常。然后,对于所有将使用ConversionService的类,您将使用您的包装器类。

您违反了。验证转换对象不是转换器的工作。如果您能够成功地进行转换,那么应该使用下面描述的方法之一单独进行验证

例如,考虑将字符串转换成纬度。如果字符串可以解析为double,那么转换器应该很高兴。如果要验证double是否在[-90,+90]范围内,则应在验证器而不是转换器中进行验证


在处理异常时,不要混淆不同的关注点会有很大帮助,比如在
@ControllerAdvice

中,不幸的是,因为conversionService.convert只抛出一个conversionfailedeexception,这对我没有帮助。我确实有一个带有@ExceptionHandler(ElasticSearchException.class)的ControllerAdvice,但它从未被调用,因为它只看到ConversionFailedException。您是否尝试处理ConversionFailedException,而不是ElasticSearchException?是的,这是有效的。但是我尝试捕获特定的异常并以不同的方式处理它们,而不是一般地捕获ConversionFailedException并将该异常转换为正确的异常。我不知道它是否能帮助您,但您可以从参数上的exception获取错误消息,以了解更多详细信息。您还可以使用try-catch块捕获ConversionFailedException,并将您自己的异常抛出到catch块不幸的是,这正是我试图避免的,我想单独捕获每个异常,而无需重新抛出。您可以通过提供代码示例来改进答案,很多人太懒或时间太短,无法阅读解释。例如,如果您想将某个内容转换为枚举,会发生什么情况?@LakatosGyula-Spring可以根据名称转换枚举,您不必这样做。你自己试试看。
@ControllerAdvice
public class ExceptionTranslator {


    @ExceptionHandler(ConversionFailedException.class) //handle your Exception
    @ResponseStatus(HttpStatus.BadRequest) // Define the status you want to return
    @ResponseBody
    public ErrorDTO processElasticSearchException(ConversionFailedException ex) {
        return new ErrorDTO(); 
        /* Format your response as you need*/
    }
}