为了账号安全,请及时绑定邮箱和手机立即绑定

如何修复 Spring Boot 中的错误自定义注解?

如何修复 Spring Boot 中的错误自定义注解?

DIEA 2021-11-17 17:03:16
我使用 spring boot 2.1.0.BUILD-SNAPSHOT。我创建了一个自定义注释:@Target({ElementType.TYPE, ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy = UniqueUserNameValidator.class)@Documentedpublic @interface UniqueUserName {    String message() default "{truyenmvc.uName.UniqueUserName.message}";    Class<?>[] groups() default {};    Class<? extends Payload>[] payload() default {};}和验证:public class UniqueUserNameValidator implements ConstraintValidator<UniqueUserName, String> {    private final UserService userServicel;    @Autowired    public UniqueUserNameValidator(UserService userServicel) {        this.userServicel = userServicel;    }    @Override    public void initialize(UniqueUserName constraintAnnotation) {    }    @Override    public boolean isValid(String userName, ConstraintValidatorContext constraintValidatorContext) {        return userName != null && !userServicel.checkUserNameExits(userName);    }}在实体@Entity@Table(schema = "", uniqueConstraints = {@UniqueConstraint(columnNames = {"uEmail"}),        @UniqueConstraint(columnNames = {"uDname"}), @UniqueConstraint(columnNames = {"uName"})})@Data@NoArgsConstructorpublic class User implements Serializable {    private static final long serialVersionUID = 1L;    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    @Column(name = "uID", unique = true, nullable = false)    private Long uID;    @NotEmpty(message = "{truyenmvc.uName.empty.message}")    @UniqueUserName    @Column(name = "uName", unique = true, nullable = false, length = 30)    private String uName;}谁能告诉我错误在哪里。以及如何克服它?谢谢!
查看完整描述

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);


查看完整回答
反对 回复 2021-11-17
?
隔江千里

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;

}

}


这没有错误。谢谢大家帮助我!!!


查看完整回答
反对 回复 2021-11-17
  • 2 回答
  • 0 关注
  • 152 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信