如何在使用@ControllerAdvice在Spring MVC中返回ResponseEntity的方法中返回错误消息

时间:2016-07-20 20:59:50

标签: java angularjs spring rest spring-mvc

我正在使用Spring MVC和AngularJS开发Web应用程序,我正在创建一个Rest API,它返回包含JSON字符串的ResponseEntities。

我希望能够在异常发生时将包含错误原因的字符串返回到我的视图,然后在AngularJS中使用模式显示此错误,我创建了一个带有@ControllerAdvice注释的类,并且在此class I我用我的自定义异常定义了一个方法

@ControllerAdvice
public class GlobalExceptionHandlerController {

@ExceptionHandler(PersonalException.class)
public String handleCustomExceptionRazon(PersonalException ex) {

    String errorMessage = "custom error";


    return errorMessage;
}
}

我有以下界面

public interface ClientDAO {

public void insertCLiente(Client client) throws PersonalException
}

在我的实施中

@Override
public void insertCLiente(Client client) throws PersonalException{

//method implementation
 if (searchCLiente(client.name())) {
        throw new PersonalException("client aleady exists");
    } else {
//method implementation
}
}

我的searchClient方法

public boolean searchClient(String name) {
try {
    //method implementation

} catch (DataAccessException dataAccessException) {
        System.out.println("");
        dataAccessException.printStackTrace();
    } catch (Exception e) {
        System.out.println("");
        e.printStackTrace();
    }
  //method implementation
}

我的客户端控制器

@Autowired
    ClientDAO clientDAO;

@RequestMapping(value = "/client/", method = RequestMethod.POST)
public ResponseEntity<Void> createClient(@RequestBody final String DTOClientData, UriComponentsBuilder ucBuilder) {

//here I parse the JSON data and create my Client object

   //here I dont know how can I return the error message

clientDAO.insertClient(client);

    }

我的自定义异常

public class PersonalException extends Exception {

public PersonalException (String msg) {
    super(msg);
}

}

我不知道我的clientController方法createClient如何返回我创建的PersonalException类型的execption

1 个答案:

答案 0 :(得分:1)

//here I dont know how can I return the error message

从控制器中抛出异常。

@RequestMapping(value = "/client/", method = RequestMethod.POST)
public ResponseEntity<Void> createClient(@RequestBody final String DTOClientData, UriComponentsBuilder ucBuilder) throws PersonalException {

您可以在GlobalExceptionHandlerController中返回错误消息,如下所示......

  /**
* REST exception handlers defined at a global level for the application
**/
@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(value = { PersonalException.class })
    protected ResponseEntity<RestResponse> handleUnknownException(PersonalException ex, WebRequest request) {
       LOGGER.error(ex.getMessage(), ex);

       return new ResponseEntity<RestResponse>(new RestResponse(Boolean.FALSE, ImmutableList.of("Exception message"), null), HttpStatus.INTERNAL_SERVER_ERROR);
     }

现在,您可能已经注意到即使在Controller中我们也没有处理Exception。相反,我们在声明中抛出它,希望我们处理这个特殊情况的某个地方优雅地向用户显示一个漂亮的Toaster消息。

问题可能仍然存在 - 我在哪里处理异常?它由GlobalExceptionHandlerController中的@ExceptionHandler处理。