【Java】@Valid @NotNull组合无法生效

Controller:

@PostMapping("/save")

public CommonResp saveMessage(@Valid MessageModel messageModel, Errors errors) {

messageService.save(messageModel.toEntity());

return new CommonResp(0, "success");

}

Model:

public class MessageModel implements Serializable, Cloneable {

private static final long serialVersionUID = -7898194272883238672L;

// 读写锁

private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

private String id;

@NotNull

private Date createTime;

// ...

// getters/setters

}

然后请求的时候什么参数也没传,但是NotNull也不检查就直接通过了,直接到了Controller里面的断点。

【Java】@Valid @NotNull组合无法生效

关键是前两天还是正常的。。突然就这样。

不知道这套注解使用起来是需要有什么注意的吗,比如没有设置什么或者多余设置了什么就无法生效之类的。

回答

解决了,自问自答一下 -,-

首先这套注解的原始使用方式应该是下面这样:

@PostMapping("/valid")

public String valid(@Valid TestModel testModel) {

return "success";

}

这样写是完全可以生效的(和我提问时的区别在于没有使用切面)。不过问题在于,如果使用这种方法,当参数不符合验证规则时,会报400错误,如下:
【Java】@Valid @NotNull组合无法生效

这样对于实际业务流程来说也许不够友好。所以一般的做法是使用切面环绕Controller方法,当有错误报出时,使用指定的处理逻辑。这样处理的话,当请求参数不符合验证规则时,会变成下面这样:
【Java】@Valid @NotNull组合无法生效

这样显然就会友好多了。
然而问题就出在切面这里。我提问时,针对Controller方法的切面定义代码如下:

@Aspect

public class FieldValidation {

@Pointcut("execution(* com.spring_test.controller.*.*(.., org.springframework.validation.Errors))")

public void aspect() {}

@Around("aspect()")

public Object around(ProceedingJoinPoint pjp) throws Throwable {

Object[] objects = pjp.getArgs();

Errors errors = (Errors) objects[objects.length - 1];

if (errors.hasErrors()) {

String msg = CommonUtil.errorMessage(errors);

return CommonUtil.commonResponse(1, msg);

}

return pjp.proceed();

}

}

没错,问题就是切面没有加

@Component

注解。。

只要给切面加上@Component注解,或者取消掉Controller方法和切面的匹配,就可以正常生效了。

虽说最后发现是粗心导致的问题,不过为什么切面错误时原本的@Valid也会失效呢?直觉上这两个没什么冲突才对,切面只是处理了@Valid时的错误,为什么切面错误时@Valid也并不报错了呢?

这点问题尚未解决,如果有dalao有兴趣,烦请指教,感谢~

你可以尝试换@Validated注解,还有你的异常建议统一处理掉,希望可以帮到你

以上是 【Java】@Valid @NotNull组合无法生效 的全部内容, 来源链接: utcz.com/a/90622.html

回到顶部