2011-01-12 26 views
16

Tôi có một backend Java với Spring MVC và tôi đang sử dụng xác nhận theo cách này trên đối tượng tên miền của tôi cho một địa chỉ email:Java/Spring MVC 3 xác nhận của một địa chỉ email

import javax.validation.constraints.NotNull; 
import javax.validation.constraints.Pattern; 
import javax.validation.constraints.Size; 
... 
@NotNull 
@Size(min = 1, max = 100) 
@Pattern(regexp="^([a-zA-Z0-9\\-\\.\\_]+)'+'(\\@)([a-zA-Z0-9\\-\\.]+)'+'(\\.)([a-zA-Z]{2,4})$") 
private String email; 

Nhưng tất cả tôi nhận được với những dòng mã

Set<ConstraintViolation<Person>> failures = validator.validate(personObject); 
... 
Map<String, String> failureMessages = new HashMap<String, String>(); 
for (ConstraintViolation<Person> failure : failures) { 
    failureMessages.put(failure.getPropertyPath().toString(), failure.getMessage()); 
    System.out.println(failure.getPropertyPath().toString()+" - "+failure.getMessage()) 
} 

tôi có được điều này trên console:

email - must match "^([a-zA-Z0-9\\-\\.\\_]+)'+'(\\@)([a-zA-Z0-9\\-\\.]+)'+'(\\.)([a-zA-Z]{2,4})$" 

nhưng tôi có như địa chỉ email 012., vì vậy regexp không khớp.

Vì vậy, tôi có hai prolems:

  • Có gì sai ở đây?
  • Và làm thế nào tôi có thể xác định một thông báo lỗi trên của riêng tôi, vì màn hình này cho người dùng, đó không phải là một điều tốt :-)

Cảm ơn bạn trước sự giúp đỡ của bạn và Best Regards.

+0

Phiên bản nào của Spring MVC bạn đang sử dụng? –

+0

Phiên bản mới nhất 3.0.5. – Tim

Trả lời

36

Nếu bạn sử dụng Hibernate Validator bạn có thể sử dụng @Email annotation Dù sao bạn có thể tạo chú thích tùy chỉnh của mình và đặt thông báo tùy chỉnh để hiển thị trong tệp thuộc tính tài nguyên của bạn.

+1

+1 Tôi khuyên bạn nên sử dụng chú thích @Email được tạo sẵn. Không có điểm trong việc này một mình. – GaryF

+1

Tôi đã thêm chú thích '@ Email' tin rằng nó sẽ tự động quản lý tất cả. Tôi đã sai. Ý nghĩa của việc sử dụng chú thích này là gì nếu tôi phải thêm bất kỳ '@ Pattern' nào? – vault

+0

Thêm vào đường dẫn lớp của bạn hibernate-validator.jar (nếu sử dụng Maven, hãy kiểm tra câu trả lời của Bassem). Nó sẽ tự động chặn bất kỳ trường hoặc thuộc tính nào được chú thích bằng chú thích @Email. –

9

Trước tiên hãy thử regex đơn giản như thế này:

"\\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\\.[A-Z]{2,4}\\b" 

hơn bạn có thể thử RFC phiên bản 2822:

"(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])" 

Hãy cho tôi biết nếu một trong hai làm việc cho bạn.

Ngoài ra hãy nhìn vào gói này

org.springmodules.validation.bean.conf.loader.annotation.handler 

đây
http://www.springbyexample.org/examples/spring-modules-validation-module.html

Nó có thể là lựa chọn tốt hơn.

+0

Tác phẩm thứ hai, nhưng tôi gặp phải một lỗi khác ... Tôi phải xem vấn đề 'javax.validation là gì.ConstraintViolationException: xác thực không thành công cho các lớp [com.mydomain.myproject.domain.Person] trong thời gian cập nhật cho các nhóm [javax.validation.groups.Default,] ' – Tim

+0

Nhưng không có phản hồi. Tôi tạo ra một câu hỏi ở đây: http://stackoverflow.com/questions/4675204/javax-validation-constraintviolationexception-validation-failed-for-classes-duri bởi vì tôi không lý do tại sao lỗi này xảy ra. Nếu tôi kiểm tra đối tượng, không có lỗi, nhưng khi cam kết đối tượng cần cập nhật, lỗi sẽ xảy ra. – Tim

+0

Tôi đã cập nhật câu hỏi mới. Vấn đề mới chỉ xảy ra nếu tôi đặt '@ Pattern' vào đối tượng miền Person của tôi. – Tim

2

Regex của bạn có một vài trường hợp là '+' trong đó, điều này thật kỳ quặc. địa chỉ e-mail thường không được yêu cầu để có dấu nháy đơn trong chúng :) Tôi nghĩ rằng có lẽ đó là có nghĩa là để ghép các phần của String, và những người nên được báo giá gấp đôi?

Để xác định thư của riêng bạn, bạn chỉ cần thêm message="{someWay.of.definingCodes}" vào chú thích. Sau đó, xác định bản dịch cho nó trong ValidationMessages.properties trong gói mặc định.

Trình xác nhận hợp lệ ngủ đông thay thế cung cấp org.hibernate.validator.Email nếu bạn sẵn sàng phụ thuộc vào tiện ích của nhà cung cấp.

+0

Tôi đã thêm thư và tạo tệp 'ValidationMessages.properties' trong thư mục WEB-INF/messages với nội dung:' someWay.of.definingCodes = test'. Nhưng kết quả là '{someWay.of.definingCodes}' thay vì 'test' ... – Tim

+0

gói mặc định thường nằm ở WEB-INF \ classes :) – Affe

+0

Ồ, được rồi, trong IDE Eclipse của tôi WEB-INF \ thư mục lớp học có vẻ trống, vì tôi không thể mở nó. Tôi có nên tạo một tệp mới có tên 'ValidationMessages.properties' vào nó không? – Tim

6

Bạn có thể sử dụng @Email từ Hibernate Validator:

<dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator</artifactId> 
     <version>5.4.1.Final</version> 
    </dependency> 
Các vấn đề liên quan