【发布时间】:2018-02-08 10:13:59
【问题描述】:
我使用 Spring 并在 @ControllerAdvice 注释的帮助下创建了用于处理所有异常的类。
@EnableWebMvc
@ControllerAdvice
class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
private final MessageSource messages;
private RestResponseEntityExceptionHandler(@Qualifier("messageSource") MessageSource messages) {
this.messages = messages;
}
@ExceptionHandler({ESInvalidValueException.class})
public ResponseEntity<Object> handleValidation(final RuntimeException ex, final WebRequest request) {
log.error("400 Status Code: " + ex.getMessage());
Locale locale = LocaleContextHolder.getLocale();
final GenericResponse body = GenericResponse.error(
messages.getMessage("portNotValid", null, locale), 400);
return handleExceptionInternal(ex, body, new HttpHeaders(), HttpStatus.BAD_REQUEST, request);
}
}
另外,我创建了扩展 AbstractPortalException 的自定义异常:
public class ESInvalidValueException extends AbstractPortalException{
public ESInvalidValueException(String message, int code) {
super(message, code);
}
}
public abstract class AbstractPortalException extends RuntimeException {
private int code;
AbstractPortalException() {
super();
}
AbstractPortalException(final String message, final Throwable cause) {
super(message, cause);
}
AbstractPortalException(final String message) {
super(message);
}
AbstractPortalException(final String message, int code) {
super(message);
this.code = code;
}
AbstractPortalException(final Throwable cause) {
super(cause);
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
}
然后我尝试借助控制器中的注释 @Valid 来验证端口号。 这是我的验证类:
@Log4j2
@Component
public class ESRequestDTOValidator implements Validator{
@Override
public boolean supports(Class<?> clazz) {
return ElasticSearchLogRequest.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
log.debug("Validating: {}", target);
ElasticSearchLogRequest form = (ElasticSearchLogRequest) target;
validatePort(form);
}
private void validatePort(ElasticSearchLogRequest form) {
String reg = "^((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})" +
"|(6[0-4][0-9]{3})|([1-5][0-9]{4})|([0-5]{0,5})|([0-9]{1,4}))$";
if (!form.getPort().toString().matches(reg)) {
throw new ESInvalidValueException("portNotValid", HTTP_BAD_REQUEST);
}
}
}
这是问题所在:messages.getMessage() 找不到带有此类代码“portNotValid”的消息。在ESInvalidValueException 异常中,我想传递不同的消息以验证其他字段,在handleValidation() 方法中,我想根据消息处理所有这些异常。我怎样才能执行这样的任务?也许还有另一种方法。
【问题讨论】:
标签: java spring exception exception-handling