繁体   English   中英

如何使Spring Converter引发自定义异常而不是ConversionFailedException?

[英]How can I make a Spring Converter throw a custom exception instead of a ConversionFailedException?

我的代码库中有一堆自定义的弹簧转换器,例如:

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
  }
}

我通过使用spring ConversionService从服务中调用这些转换器

@Service
public class ElasticService {
  @Autowired
  private ConversionService conversionService;

  public ResponseModel getResponse(RequestModel requestModel) {

    //Throws ConversionFailedException instead of ElasticSearchException
    ResponseModel responseModel = conversionService.convert(requestModel, ResponseModel.class);

    return responseModel;
  }
}

我的问题是,当我将我的ElasticSearchException放入我的ElasticSearchConverter它被捕获在spring ConversionUtils类中,并转换为ConversionFailedException 我想捕获在转换器中抛出的特定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 “带有(注释)的类可以显式声明为Spring bean或通过类路径扫描自动检测” 显示文档
@ExceptionHandler定义要捕获的异常
@ResponseStatus定义http响应状态
@ResponseBody序列化自动响应为json对象

对于我的项目,我定义了一个ErrorDTO来格式化响应,您可以执行同样的操作,而只需构造对象并返回它
您还可以将要执行的代码放入此方法中,并在需要时引发其他异常

您可以编写包装Spring ConversionService的简单适配器类。 在该类中,您将具有一个convert()方法,该方法在try / catch中委托给包装的ConversionService方法,捕获ConversionFailedException,对其进行检查(例如,使用getRootCause()),然后将其作为您选择的异常重新抛出。 然后,对于所有其他将使用ConversionService的类,则应使用包装器类。

您违反了“ 单一责任原则” 验证转换后的对象不是转换器的工作。 如果您能够成功进行转换,则应使用此处所述的方法之一分别进行验证。

例如,考虑将字符串转换为纬度。 如果可以将字符串解析为双精度型,则转换器应该很满意。 如果要验证double是否在[-90,+ 90]范围内,则应使用验证器而不是转换器。

@ControllerAdvice说,在处理异常时,不混淆不同的顾虑将有很大帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM