业务层中的@ControllerAdvice和Create Error Message

时间:2018-02-09 01:49:55

标签: spring

假设我已经定义了@ControllerAdvice

@ControllerAdvice
public class ErrorHandler {

 // example
@ExceptionHandler(ParseException.class)
public void handleParseException(ParseException exception, HttpServletResponse response) {
    // return response - error message, error description, error type (ERROR or EXCEPTION)
}
}

问题在于我将使用参数以及消息类型 -​​ 错误或异常

来制定错误消息文本。

示例,假设给定文件名

,则抛出找不到文件异常

通常,在message.properties文件中,我们将使用文件作为文件{0}存在

错误消息的翻译通常发生在表示层中.....

现在,如果我们需要传递错误消息,以便控制器建议负责将其传递给UI ....

我们是否需要在发送之前在服务层中构造错误消息?哪里的例外和参数将被绑定???

例如

public void accessFile(String fileName) { 
  File file = new File(fileName); 
  if(!file.exists()) { 
   throw new FileNotFoundException(Constants.FILE_NOT_FOUND.....); 
   How to construct the error message with property key and sending with 
   proper error message binded with exception??? 
  so that in controller advice we would just use exception.getMessage() 
  which will have the translated text. 

  } 
}

请让我知道怎么做。

1 个答案:

答案 0 :(得分:0)

我会有一个类似下面的方法来创建一个json对象,并在UI中使用相同的方法来填充错误消息。

@RestControllerAdvice
public class ExceptionProcessor {
//..... 
//.....
@ExceptionHandler(IOException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ErrorResource handleParseException(final IOException ex, final WebRequest request) {
    // return response - error message, error description, error type (ERROR or EXCEPTION)
    return _errorBuilder.build(ex, GenericErrorCode.ERR0500, request)
            .setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR.value())// error code
            .setMessage("Internal server error") //message
            .setDetails(new ErrorDetailResource.Builder()
                    .setLocationType("system")
                    .setMessage(ex.getMessage())// description
                    .build())
            .build();
}   

所以基本上你是从异常中创建一个对象并将其作为响应传回来,以便UI可以适当地处理这个错误消息。

现在您可以设计对象以将其传递给UI

您可以在业务层中构建错误消息,同时抛出激活或从属性中读取它,如下所示。

 @Value("${error.invalidfile.message}")
 private String parseErrMessage;

然后在创建消息时使用该方法,请使用此消息

---------编辑2

如果您需要传递除excpetion消息之外的其他内容,请创建自己的例外。

MyIOException extends IOException{
 //...
 String exceptionMessagKey;
 //getter and setter
 }

然后抛出并捕获此异常并根据消息和excpetion对象中的exceptionMessagKey构建消息。

 public ErrorResource handleParseException(final MyIOException ex, final WebRequest request){
... 
// Use     ex.getExceptionMessagKey() and ex.getMessage()
....
}