問題現象
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
public class IDDTO {
@NotNull
private Long id;
}
@Slf4j
@Controller
@RequestMapping("/example")
public class ExampleController {
@POSTMapping(value = "/valid")
public BaseResponseVO valid(@Valid IDDTO idDTO, BindingResult bindingResult){
if(bindingResult.hasErrors()){
log.error("what fuck");
}
return BaseResponseVO.success();
}
}
看起來像不像會打印what fuck
,實際上居然不會。實際上是因爲Valid Property 會在json序列化構建Java Bean的時候,所以這裏的Post請求還必須是application/json
即:
@POSTMapping(value = "/valid")
public BaseResponseVO valid(@Valid @RequestBody IDDTO idDTO, BindingResult bindingResult){
if(bindingResult.hasErrors()){
log.error("what fuck");
}
return BaseResponseVO.success();
}
手動檢查
如果有其他情況發現@Valid
不生效,提供一個手動檢查的方案
import org.apache.commons.collections.CollectionUtils;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class ValidateUtil {
private static Validator validator = Validation.buildDefaultValidatorFactory()
.getValidator();
public static void beanValidate(Object obj) {
Map<String, String> validatedMsg = new HashMap<>();
Set<ConstraintViolation<Object>> constraintViolations = validator.validate(obj);
for (ConstraintViolation<Object> c : constraintViolations) {
validatedMsg.put(c.getPropertyPath().toString(), c.getMessage());
}
if (CollectionUtils.isNotEmpty(constraintViolations)) {
throw new Exception(validatedMsg);
}
}
}
即:
@Slf4j
@Controller
@RequestMapping("/example")
public class ExampleController {
@POSTMapping(value = "/valid")
public BaseResponseVO valid(IDDTO idDTO){
ValidateUtil.beanValidate(idDTO);
return BaseResponseVO.success();
}
}