亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何修復 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 關注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號