U mnie działa ze Spring Boot 2.1.6.RELEASE & Java 12.
Kopiuj
public class MyPojo {
@MyConstraint
private String field;
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
}
Kopiuj
@Documented
@Constraint(validatedBy = MyValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface MyConstraint {
String message() default "Invalid String";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Kopiuj
public class MyValidator implements ConstraintValidator<MyConstraint, String> {
@Autowired
private MyService service;
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
return true;
}
return service.m(value);
}
@Override
public void initialize(MyConstraint constraintAnnotation) {
}
}
Kopiuj
@Service
public class MyService {
public boolean m(String s) {
return "a".equals(s);
}
}
Kopiuj
@RestController
public class MyController {
@PostMapping("/")
public String m(@Validated @RequestBody MyPojo body) {
return "ok";
}
}
Kopiuj
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Testy manualne:
request:
Kopiuj
POST http://localhost:8080
Accept: application/json
Content-Type: application/json
{
"field": "a"
}
response:
Kopiuj
POST http://localhost:8080
HTTP/1.1 200
Content-Type: application/json;charset=UTF-8
Content-Length: 2
Date: Wed, 19 Jun 2019 20:41:45 GMT
ok
request:
Kopiuj
POST http://localhost:8080
Accept: application/json
Content-Type: application/json
{
"field": "b"
}
response:
Kopiuj
POST http://localhost:8080
HTTP/1.1 400
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 19 Jun 2019 20:46:14 GMT
Connection: close
{
(...)
"defaultMessage": "Invalid String",
(...)
}
6 lat temu, podczas nauki Javy, napisałem CRUDa z webówką na jsp i też mi działało do walidacji formularza (Spring 4.1.4.RELEASE bez Boot, Java 8). Nawet use case ten sam:
Kopiuj
public class EmailAvailableValidator implements ConstraintValidator<EmailAvailable, String> {
@Resource
private UserService userService;
public void initialize(EmailAvailable constraintAnnotation) {}
public boolean isValid(String object, ConstraintValidatorContext constraintContext) {
if (object == null)
return true;
return userService.isEmailAvailable(object);
}
}