2 回答
TA贡献1866条经验 获得超5个赞
我认为您应该使用@RestControllerAdvice注释,因为违反约束是一个例外。我认为通过异常处理这个比使用自定义验证器更有效。您可以为您的特定业务逻辑使用验证器。
例如:
public class ConstraintViolationException extends BaseApiRuntimeException {
private static final long serialVersionUID = 1L;
public ConstraintViolationException([module eg. enum of project modules] module, String resource) {
super(module, resource);
}
}
BaseApiRuntimeException 仅扩展 RuntimeException。包装它将使您更灵活地自定义异常消息。
使用控制器建议构建异常处理程序:
@RestControllerAdvice
public class CommonExceptionHandler {
@ExceptionHandler(ConstraintViolationException.class)
public ResponseEntity<ErrorDetail> handleConstraintViolationException(
HttpServletRequest request, ConstraintViolationException base) {
LOG.info("CONSTRAINT VIOLATION EXCEPTION: ", base);
ErrorDetail error = new ErrorDetail<ConstraintViolationException>().setErrorDetails(
CONSTRAINT_VIOLATION, base, "CONSTRAINT VIOLATION USERNAME ALREADY EXIST.");
return new ResponseEntity<ErrorDetail>(error, HttpStatus.UNPROCESSABLE_ENTITY);
}
}
您可以在此处创建自己的包装器以生成自定义响应。在这个例子中是 ErrorDetail 类。搜索RestControllerAdvice以获取更多详细信息。您还可以针对您的特定用例将 basePackages 添加到此注释中。
编辑:服务层
你可以这样使用:
throw new ConstraintViolationException([module package e.g enum or string],
"any custom message here: " + anything);
TA贡献1906条经验 获得超10个赞
我更改了 UniqueUserNameValidator 类:
public class UniqueUserNameValidator implements ConstraintValidator<UniqueUserName, String> {
@Autowired
private UserService userServicel;
private String message;
@Override
public void initialize(UniqueUserName constraintAnnotation) {
message = constraintAnnotation.message();
}
@Override
public boolean isValid(String userName, ConstraintValidatorContext constraintValidatorContext) {
boolean valid = true;
try {
valid = userName != null && !userServicel.checkUserNameExits(userName);
} catch (Exception e) {
}
if (!valid) {
constraintValidatorContext.buildConstraintViolationWithTemplate(message)
.addConstraintViolation()
.disableDefaultConstraintViolation();
}
return valid;
}
}
这没有错误。谢谢大家帮助我!!!
添加回答
举报