Add a Custom message for the Unique Constraints in hibernate

前端 未结 3 1096
情歌与酒
情歌与酒 2021-01-06 07:22
@Entity @Table(name=\"users\",uniqueConstraints = {@UniqueConstraint(columnNames = {\"email\"})})
public class User implements Serializable {
    @Column(unique = tr         


        
相关标签:
3条回答
  • 2021-01-06 07:43

    I resolve similar problem in Spring Boot I Hope It will help u.

    @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;
    }
    

    }

    0 讨论(0)
  • 2021-01-06 08:02

    In your UserRepository File

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

    In your controller file

    @Autowired
    private UserRepository userRepository;
    
    if(userRepository.existsByEmail(pass_email_HERE)) {
            throw new YourCustomExceptionException("CUSTOM_ERROR_MESSAGE");
        }
    
    0 讨论(0)
  • 2021-01-06 08:05

    User defined annotation "@Unique" in the model User.java

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

    message.properties

    Unique.email = Email id already exists
    

    Unique.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;
        }
    }
    

    UserService.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;
      }
    }
    
    0 讨论(0)
提交回复
热议问题