Java 如何使Spring转换器抛出自定义异常而不是ConversionFailedException?
我的代码库中有一堆定制的spring转换器,比如: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
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
时,它在springConversionUtils
类中被捕获,并转换为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*/
}
}