2011-09-28 20 views
10

Creé una fachada de Session EJB en mi Netbeans 7 para guardar mi entidad. Tengo una asignación manytoone entre mi seguro y la clase RatePlan.Restricciones de validación de beans violadas al ejecutar la validación automática de beans en el evento de devolución de llamadas: 'prePersist'

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

Cuando traté de guardar en mi base de datos utilizando mi EJB Session Bean, me encuentro con el siguiente error.

Causado por: javax.validation.ConstraintViolationException: restricción Bean Validation (s) violados durante la ejecución automática Bean Validation en caso de devolución de llamada: 'PrePersist'. Por favor, consulte ConstraintViolations incorporado para más detalles.

Lo que hice fue desactivar mi validación de Bean en mi archivo Persistence.xml. Me gustaría saber qué error de validación de Bean se ha producido, pero no sé cómo ni dónde encontrarlo ni cómo configurarlo y atraparlo.

Mi fachada EJB es una clase simple como tis.

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

¿Alguna sugerencia?

+0

Tengo curiosidad por saber qué violación podría haber, cuando no hay anotaciones específicas de validación de frijol en estas entidades. – stratwine

+0

De hecho elimino toda la anotación de validación de frijol para que el código sea más fácil de leer ... =) –

Respuesta

10

Me gustaría saber qué error de validación de Bean ha ocurrido pero no sé cómo ni dónde encontrarlo o cómo configurarlo y atraparlo.

Para saber qué infracciones de restricciones específicas se han producido, puede inspeccionar la excepción capturada. ConstraintViolationException.getConstraintViolations() devuelve un conjunto de ConstraintViolation s que puede iterar e inspeccionar.

+0

Hola stratwine, ¿quieres decir en mi clase de fachada EJB y en la operación guardar, usaría un bloque try catch para comprobar esta excepción? ¿Puedes confirmar mi entendimiento? Gracias –

+0

[Este hilo] (http://stackoverflow.com/questions/3793649/why-session-bean-method-throw-ejbtransactionrolledbackexception-when-runtimeexcep/3793785#3793785), con la publicación del blog inline muestra cómo podrías tener ConstraintVioldationException como ApplicationException y, por lo tanto, obtenerlo "tal como está" en el cliente. Me parece bien tener un bloque catch en el cliente invocador, verificando lo que se violó. – 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

que tiene el mismo problema, pero después de horas buscando la respuesta, Finalmente lo encontré .... debería editar su AbstractFacade.java clase y añadir este código

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

Ahora este método le avisará qué propiedad y por qué no valida la validación. Espero que esto funcione para usted, como lo hace para mí.

0

Captura la siguiente excepción donde persiste la entidad. En mi caso, está en el método de agregar EJB. donde estoy haciendo em.persist(). Luego verifique el registro del servidor, verá qué atributo tiene restricción de violación.

catch (ConstraintViolationException e) { 
     log.log(Level.SEVERE,"Exception: "); 
     e.getConstraintViolations().forEach(err->log.log(Level.SEVERE,err.toString())); 
    } 
Cuestiones relacionadas