Saj*_*ran 8 java jax-rs hibernate-validator spring-boot
我正在使用下面给出的 ConstraintValidator 实现来验证 Spring Boot REST 服务的请求对象
@Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = MyRequestValidator.class)
@Documented
public @interface MyRequestValidation {
String message() default "Mandatory fields missing";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class MyRequestValidator
implements
ConstraintValidator<MyRequestValidation, MyRequest>{
@Override
public void initialize(MyRequestValidation constraintAnnotation) {
// Nothing to do here
}
@Override
public boolean isValid(MyRequest myRequest, ConstraintValidatorContext context) {
//do some validation
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate("Id can contain only alphabets and digits")
.addPropertyNode("id")
.addConstraintViolation();
}
}
//REST end point
public interface RestApi{
@Produces(MediaType.XML)
@Consumes(MediaType.XML)
@POST
MyResponse action(@MyRequestValidation MyRequest myRequest);
}
@Component
public class RestApiImpl implements RestApi {
..
}
Run Code Online (Sandbox Code Playgroud)
这产生输出为
[PARAMETER]
[myRequest.arg0.id]
[Id can contain only alphabets and digits]
Run Code Online (Sandbox Code Playgroud)
无论如何都可以生成 JSON 或 XML 消息(或基于 REST 端点上的 @Produces 注释)。我正在使用这些接口 ConstraintValidatorContext 的 Hibernate 实现
是的,您可以ConstraintViolationException通过实施捕获何时发生, custom error handler然后您也可以在您的响应和状态中添加任何内容。
ConstraintViolationException1.-抛出时更改状态的简单方法。
import javax.validation.ConstraintViolationException;
@ControllerAdvice
public class CustomErrorHandler {
@ExceptionHandler(ConstraintViolationException.class)
public void handleConstraintViolationException(ConstraintViolationException exception,
ServletWebRequest webRequest) throws IOException {
webRequest.getResponse().sendError(HttpStatus.BAD_REQUEST.value(), exception.getMessage());
}
}
Run Code Online (Sandbox Code Playgroud)
2.- 发生时放置响应的自定义方式ConstraintViolationException。
@ControllerAdvice
public class CustomErrorHandler {
@ExceptionHandler(ConstraintViolationException.class)
public ResponseEntity<CustomError> handleConstraintViolationException(ConstraintViolationException exception) {
CustomError customError = new CustomError();
customError.setStatus(HttpStatus.BAD_REQUEST);
customError.setMessage(exception.getMessage());
customError.addConstraintErrors(exception.getConstraintViolations());
return ResponseEntity.badRequest().body(customError);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3710 次 |
| 最近记录: |