2013-10-04 2 views
1

Я хочу, чтобы создать собственный бизнес исключение:Пользовательские пружинные Исключения с переменными связывания

public class BusinessException extends RuntimeException { 

    private static final long serialVersionUID = 1L; 

    public BusinessException(String msg) { 

     super(msg); 
    } 

    public BusinessException(String msg, Object[] params) { 

     //Not sure how to pass params to @ExceptionHandler 

     super(msg); 
    } 

} 

и использовать его в моей Spring MVC контроллер отдыха:

@RequestMapping(value = "/{code}", method = RequestMethod.GET) 
    public @ResponseBody 
    String getState(@PathVariable String code) throws Exception { 
     String result; 
     if (code.equals("KL")) { 
      result = "Kerala"; 
     } else { 

      throw new BusinessException("NotAValidStateCode",new Object[]{code}); 
     } 
     return result; 
    } 

Я обработки все businessException, используя общие обработчик исключений:

@ControllerAdvice 
public class RestErrorHandler { 

    private static final Logger LOGGER = LoggerFactory 
      .getLogger(RestErrorHandler.class); 

    @Autowired 
    private MessageSource messageSource; 

    @ExceptionHandler(BusinessException.class) 
    @ResponseStatus(HttpStatus.BAD_REQUEST) 
    @ResponseBody 
    public String handleException(

    Exception ex) { 

     Object[] args=null; // Not sure how do I get the args from custom BusinessException 

     String message = messageSource.getMessage(ex.getLocalizedMessage(), 
       args, LocaleContextHolder.getLocale()); 

     LOGGER.debug("Inside Handle Exception:" + message); 

     return message; 

    } 

} 

Теперь моя проблема в том, что я хочу прочитать текст сообщения из сообщения s, где некоторые из ключей ожидают переменные связывания времени выполнения, например.

NotAValidStateCode= Not a valid state code ({0}) 

Я не уверен, как передать эти аргументы для обработки метода Exception RestErrorHandler.

ответ

1

Это просто, как вы уже сделали все "тяжелую":

public class BusinessException extends RuntimeException { 

    private static final long serialVersionUID = 1L; 

    private final Object[] params; 

    public BusinessException(String msg, Object[] params) { 
     super(msg); 
     this.params = params; 
    } 

    public Object[] getParams() { 
     return params; 
    } 

} 

@ExceptionHandler 
@ResponseStatus(HttpStatus.BAD_REQUEST) 
@ResponseBody 
public String handleException(BusinessException ex) { 
    String message = messageSource.getMessage(ex.getMessage(), 
      ex.getParams(), LocaleContextHolder.getLocale()); 
    LOGGER.debug("Inside Handle Exception:" + message); 
    return message; 
} 
0

Я бы порекомендовал инкапсулировать все, что вам нужно, чтобы создать сообщение об ошибке в BusinessException. Вы уже проходите в code как часть массива параметров. Либо выведите весь массив с помощью метода getParams(), либо (и это будет мой подход) добавьте поле кода и метод getCode() в BusinessException и добавьте аргумент code в конструктор BusinessException. Затем вы можете обновить handleException, чтобы принять BusinessException, а не Exception и использовать getCode() при создании аргументов, используемых для создания сообщения.

Смежные вопросы