2011-09-28 19 views
10

Tôi đã tạo mặt tiền phiên EJB trong Netbeans 7 để lưu thực thể của mình. Tôi có một ánh xạ nhiều người giữa Bảo hiểm của tôi và Lớp RatePlan.Ràng buộc xác nhận đậu bị vi phạm trong khi thực hiện Xác thực Bean tự động trên sự kiện gọi lại: 'prePersist'

public class Insurance{ 
    @ManyToOne(optional=false) 
    @JoinColumn(name="PLAN_ID") 
    private RatePlan plan; 
} 
public class RatePlan{ 
    @OneToMany(mappedBy="plan") 
    private Set<Insurance> insuranceItems; 
} 

Khi tôi thử lưu trong cơ sở dữ liệu của mình bằng EJB Session Bean, tôi gặp phải lỗi bên dưới.

Gây ra bởi: javax.validation.ConstraintViolationException: Bean Hạn chế xác thực bị vi phạm trong khi thực thi Xác thực Bean tự động trên sự kiện gọi lại: 'prePersist'. Vui lòng tham khảo các giải pháp ConstraintViolations được nhúng để biết chi tiết.

Điều tôi đã làm là tắt tính năng xác thực Bean trong tệp Persistence.xml của mình. Tôi muốn biết lỗi xác thực Bean đã xảy ra nhưng tôi không biết cách hoặc tìm nơi hoặc cách cấu hình và bắt nó.

Mặt tiền EJB của tôi là một lớp đơn giản như tis.

public class InsuranceFacade{ 
    public void saveInsurance(Insurance insurance){ 
     em.persist(insurance); 
    } 
} 

Bất kỳ gợi ý nào?

+0

Tôi tò mò muốn biết vi phạm có thể là gì, khi không có chú thích xác thực bean cụ thể trong các thực thể này! – stratwine

+0

Tôi thực sự xóa tất cả chú thích xác nhận bean để mã dễ đọc hơn ... =) –

Trả lời

10

Tôi muốn biết lỗi xác thực Bean đã xảy ra nhưng tôi không biết cách tìm hoặc cách tìm hoặc cách cấu hình và bắt nó.

Để biết những vi phạm ràng buộc cụ thể nào đã xảy ra, bạn chỉ có thể kiểm tra ngoại lệ bị bắt. ConstraintViolationException.getConstraintViolations() trả về một Tập hợp các số ConstraintViolation mà bạn có thể lặp lại và kiểm tra.

+0

Xin chào, bạn có ý nghĩa trong lớp mặt tiền EJB của tôi và trong thao tác lưu, tôi sẽ sử dụng khối try try to kiểm tra ngoại lệ này? Bạn có thể xác nhận sự hiểu biết của tôi không? Cảm ơn –

+0

[Chủ đề này] (http://stackoverflow.com/questions/3793649/why-session-bean-method-throw-ejbtransactionrolledbackexception-when-runtimeexcep/3793785#3793785), với bài đăng trên blog nội tuyến cho thấy cách bạn có thể có ConstraintVioldationException như là một ApplicationException, và do đó có được nó "như nó là" trong máy khách. Nó có vẻ tốt với tôi để có một khối catch tại khách hàng gọi, kiểm tra những gì đã bị vi phạm. – stratwine

6
catch (EJBException e) { 
     @SuppressWarnings("ThrowableResultIgnored") 
     Exception cause = e.getCausedByException(); 
     if (cause instanceof ConstraintViolationException) { 
      @SuppressWarnings("ThrowableResultIgnored") 
      ConstraintViolationException cve = (ConstraintViolationException) e.getCausedByException(); 
      for (Iterator<ConstraintViolation<?>> it = cve.getConstraintViolations().iterator(); it.hasNext();) { 
       ConstraintViolation<? extends Object> v = it.next(); 
       System.err.println(v); 
       System.err.println("==>>"+v.getMessage()); 
      } 
     } 
     Assert.fail("ejb exception"); 
    } 
3

Tôi có cùng một vấn đề, nhưng sau giờ tìm kiếm câu trả lời, Cuối cùng tôi tìm thấy nó .... Bạn nên sửa AbstractFacade.java lớp học của bạn và thêm mã này

public void create(T entity) { 

    ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
    Validator validator = factory.getValidator(); 
    Set<ConstraintViolation<T>> constraintViolations = validator.validate(entity); 
    if(constraintViolations.size() > 0){ 
     Iterator<ConstraintViolation<T>> iterator = constraintViolations.iterator(); 
     while(iterator.hasNext()){ 
      ConstraintViolation<T> cv = iterator.next(); 
      System.err.println(cv.getRootBeanClass().getName()+"."+cv.getPropertyPath() + " " +cv.getMessage()); 

      JsfUtil.addErrorMessage(cv.getRootBeanClass().getSimpleName()+"."+cv.getPropertyPath() + " " +cv.getMessage()); 
     } 
    }else{ 
     getEntityManager().persist(entity); 
    } 
} 

Bây giờ, phương pháp này sẽ cảnh báo bạn thuộc tính nào và tại sao nó không thực hiện được việc xác thực. Tôi hy vọng điều này phù hợp với bạn, cũng như đối với tôi.

0

Ghi ngoại lệ sau đây khi bạn vẫn kiên trì thực thể. Trong trường hợp của tôi, nó trong phương thức thêm EJB. nơi tôi đang làm em.persist(). Sau đó kiểm tra nhật ký máy chủ, bạn sẽ thấy thuộc tính nào có vi phạm hạn chế.

catch (ConstraintViolationException e) { 
     log.log(Level.SEVERE,"Exception: "); 
     e.getConstraintViolations().forEach(err->log.log(Level.SEVERE,err.toString())); 
    } 
Các vấn đề liên quan