簡體   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