【问题标题】:Add a Custom message for the Unique Constraints in hibernate为休眠中的唯一约束添加自定义消息
【发布时间】:2018-05-22 11:28:20
【问题描述】:
@Entity @Table(name="users",uniqueConstraints = {@UniqueConstraint(columnNames = {"email"})})
public class User implements Serializable {
    @Column(unique = true,name = "email")
    @NotNull(message = "{NotNull.email}")
    @Email(message = "{Pattern.email}")
    @Size(min=10, max=50)
    private String email;

    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; } 
}

我的 message.properties 文件工作正常

 NotNull.email = Email is required

 Pattern.email = Enter a valid email address

我可以在 message.properties 文件中添加另一个字段,例如

 Unique.email = Email already exits 

并将此 Unique.email 发送给

@Column(unique = true,name = "email",message="{Unique.email}")

我知道,我们不能在上面的行中保留 message="{Unique.email}"。

但是我们如何将“Unique.email”提供给上面的列以获取自定义错误消息

??

提前致谢

【问题讨论】:

    标签: hibernate spring-mvc


    【解决方案1】:

    在您的 UserRepository 文件中

    public interface UserRepository extends JpaRepository<User, Long> {
          Boolean existsByEmail(String email);
    }
    

    在你的控制器文件中

    @Autowired
    private UserRepository userRepository;
    
    if(userRepository.existsByEmail(pass_email_HERE)) {
            throw new YourCustomExceptionException("CUSTOM_ERROR_MESSAGE");
        }
    

    【讨论】:

      【解决方案2】:

      模型User.java中用户定义的注解“@Unique”

      @Column(unique = true,name = "email")
      @Unique(message = "{Unique.email}")
      private String email;
      

      message.properties

      Unique.email = Email id already exists
      

      唯一的.java

      import java.lang.annotation.Documented;
      import java.lang.annotation.ElementType;
      import java.lang.annotation.Retention;
      import java.lang.annotation.Target;
      import javax.validation.Constraint;
      import javax.validation.Payload;
      import static java.lang.annotation.RetentionPolicy.RUNTIME;
      
      @Documented
      @Target({ElementType.METHOD, ElementType.FIELD})
      @Constraint(validatedBy = UserUniqueValidator.class)
      @Retention(RUNTIME)
      public @interface Unique {
          String message();
          Class<?>[] groups() default { };
          Class<? extends Payload>[] payload() default { };
      }
      

      UserUniqueValidator.java

      import com.User;
      import com.UserService;
      import org.springframework.beans.factory.annotation.Autowired;
      import javax.validation.ConstraintValidator;
      import javax.validation.ConstraintValidatorContext;
      
      public class UserUniqueValidator implements ConstraintValidator<Unique,String> {
      
          @Autowired
          private UserService userService;
      
          @Override
          public void initialize(Unique unique) {
              unique.message();
          }
      
          @Override
          public boolean isValid(String email, ConstraintValidatorContext context) {
              if (userService != null && userService.existsByEmail(email,User.class)) {
                  return false;
              }
              return true;
          }
      }
      

      用户服务.java

      public interface UserService {
          public boolean existsByEmail(String email,Class clazz);
      }
      

      UserServiceImpl.java

      import com.UserRepository;
      import org.springframework.stereotype.Service;
      import org.springframework.transaction.annotation.Transactional;
      
      @Service
      @Transactional
      public class UserServiceImpl extends UserRepository implements UserService  {
      
          @Override
          public boolean existsByEmail(String email, Class clazz) {
              return super.existsByEmail(email,clazz);
          } 
      
      }
      

      UserRepository.java

      public class UserRepository {
        public boolean existsByEmail(String email, Class className) {
            Criteria criteria = getSession().createCriteria(className,"userEmail");
            criteria.add(Restrictions.eq("email",email));
            if(criteria.list().size() == 0){
                  return false;
            }
            return true;
        }
      }
      

      【讨论】:

      • 对于这个解决方案,你必须在数据库中使用'find',这是错误的!
      • @saeedeh 您有什么想法可以避免“寻找”此解决方案的用途?
      • @Semantic 如何将此注释用于更多表?我需要为所有验证器创建单独的实现吗?
      • @Semantic 此实现也会在更新记录时引发验证错误。如何解决?
      【解决方案3】:

      我在 Spring Boot 中解决了类似的问题,希望对您有所帮助。

      @ControllerAdvice
      public class ControllerExceptionHandler extends ResponseEntityExceptionHandler {
      
      @ExceptionHandler(value = {DataIntegrityViolationException.class})
      protected ResponseEntity<JSONObject> handleConflict(DataIntegrityViolationException ex, WebRequest request) {
          JSONObject result = new JSONObject();
          result.appendField("result", false);
          String errorMessage = "";
      
          org.hibernate.exception.ConstraintViolationException exDetail =
                  (org.hibernate.exception.ConstraintViolationException) ex.getCause();
      
          errorMessage = fieldCnvrt(exDetail.getConstraintName()) + " birden fazla aynı değer içeremez!";
      
      
          result.appendField("message", errorMessage);
          return ResponseEntity.status(HttpStatus.NOT_ACCEPTABLE).body(result);
      }
      
      private String fieldCnvrt(String field) {
          switch (field) {
              case "username":
                  field = "Kullanıcı Adı";
                  break;
              case "email":
                  field = "Email";
                  break;
              case "short_name":
                  field = "Kısaltımış Ad";
                  break;
              case "name":
                  field = "Ad";
                  break;
          }
      
          return field;
      }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-20
        • 1970-01-01
        相关资源
        最近更新 更多