2013-06-13 14 views
9

Giả sử rằng tôi có biểu mẫu, nơi tôi có thể gửi username(@NaturalId)password cho người dùng mới.Cách @Validate tên người dùng duy nhất vào mùa xuân?

Tôi muốn thêm người dùng với duy nhất username. Làm thế nào @Valid điều này thông qua addnotations, và nếu tên người dùng không phải là uniq hiển thị này trong jsp thông qua <form:error/>?

Trả lời

2

JSR-303 không hỗ trợ những gì bạn muốn (giống như ràng buộc @Unique). Bạn phải viết cho bạn trình xác thực của riêng bạn. Làm thế nào điều này có thể được thực hiện được giải thích ở đây: https://community.jboss.org/wiki/AccessingtheHibernateSessionwithinaConstraintValidator

Nhưng trước khi làm điều đó chắc chắn rằng bạn đọc câu trả lời này: https://stackoverflow.com/a/3499111/1981720

Và câu này từ bài viết theo thời gian:

Lý do @Unique không phải là một phần của các ràng buộc được xây dựng trong là một thực tế truy cập Session/EntityManager trong quá trình xác định giá trị đang mở cho chính bạn đọc ma.

16

AFAIK không có chú thích để thực hiện việc này. Bạn có hai tùy chọn

Một, tạo chú thích trình xác thực tùy chỉnh. Here là một ví dụ rất hay. Thực hiện cuộc gọi đến lớp DAO của bạn và kiểm tra tính sẵn sàng trong việc thực hiện validator

public boolean isValid(String object, ConstraintValidatorContext constraintContext) { 

    return userDAO.userNameAvailable(object); //some method to check username availability 
    } 

HOẶC

Đặt độc đáo = true về sở hữu của bạn trong lớp thực thể của bạn.

@Column(unique = true) 
    private String userName; 

Nhưng điều này sẽ không hoạt động với @valid, thay vào đó hãy ném ngoại lệ về sự kiên trì. Bạn phải sử dụng một logic thích hợp để xử lý điều đó.

Giải pháp đầu tiên không phải là bằng chứng đánh lừa. Kiểm tra this câu trả lời trên SO.

Điều thứ hai sẽ không bao giờ thất bại.

CẬP NHẬT

Như NimChimpsky nhận xét, sử dụng cả hai với nhau sẽ là một giải pháp cụ thể.

+0

tôi khuyên bạn nên sử dụng cả hai phương pháp – NimChimpsky

+0

Vâng, sau khi đào một chút tôi cảm thấy rằng điều thứ hai là tốt hơn :) Nó sẽ không bao giờ thất bại không giống như cái đầu tiên. – shazinltc

+0

um, cũng phụ thuộc vào xử lý ngoại lệ khi người dùng nhập tên người dùng hiện có trước, tôi sẽ nhập dữ liệu người dùng trước khi cố gắng duy trì – NimChimpsky

0

Bạn có thể sử dụng UserDetailsService chuẩn bị lớp mùa xuân và mở rộng nó và tùy chỉnh nó:

@Service 
public class LoginDetailsServiceImpl implements UserDetailsService, Serializable { 

    @Autowired 
    LoginService loginService; 
    @Override 
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
     if (username == "" || username.isEmpty()) { 
      throw new UsernameNotFoundException(String.format("User %s is invalid!", username)); 
     } 
     Login login = loginService.find(username); 
     if (login == null) { 
      throw new UsernameNotFoundException(String.format("User %s does not exist!", username)); 
     } 
     if (!loginService.scheduleChecking(login.getScheduled())) { 
      throw new UsernameNotFoundException(String.format("User %s is not authorized this time!", username)); 
     } 
     //....