7

Estoy usando el módulo CRUD de Play para crear un conjunto simple de pantallas de administración. Uno de mis modelos es Usuario y quiero aplicar una restricción única en el campo del correo electrónico.¿Es posible configurar el módulo CRUD de Play Framework para que respete las anotaciones @Column (unique = true)?

El código es el siguiente:

public class User extends Model { 
    @Email 
    @Required 
    @Column(unique=true) 
    public String email; 

La pantalla de administración se muestra correctamente - cuando intento de romper la singularidad (por el ahorro de un usuario con un correo electrónico que ya se utiliza) me sale este error (en el navegador):

Execution exception 
PersistenceException occured : org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 

In {module:crud}/app/controllers/CRUD.java (around line 100) 

96: 
      } catch (TemplateNotFoundException e) { 

97: 
       render("CRUD/show.html", type, object); 

98: 
      } 

99: 
     } 


100: 
     <b>object._save();</b> 

101: 
     flash.success(Messages.get("crud.saved", type.modelName)); 

102: 
     if (params.get("_save") != null) { 

103: 
      redirect(request.controller + ".list"); 

104: 
     } 

105: 
     redirect(request.controller + ".show", object._key()); 

106: 
    } 

¿Hay algún ajuste que pueda hacer para usar el módulo CRUD Y las anotaciones de singularidad de columna?

Respuesta

0

Me parece que el sistema está haciendo lo que usted esperaba. Lo único que puedo imaginar es aplicarle un parche al módulo CRUD para detectar esta excepción y ser más amable, pero en general las restricciones únicas son restricciones del lado de la base de datos y solo se pueden verificar al intentar escribir en la base de datos. Entonces, una restricción única no es una anotación de validación (que se puede ejecutar antes de escribir en la base de datos).

+0

Sí, acordaron la restricción está trabajando como me gustaría. Es el parche en el módulo CRUD para que pueda dar una respuesta elegante al usuario que me pregunto. Tal vez esto está más allá del alcance de una herramienta CRUD simple. –

2

Puede crear un control personalizado y agregarlo a la propiedad de correo electrónico en la clase Usuario.

 
public class UniqueCheck extends Check { 

    @Override 
    public boolean isSatisfied(Object validatedObject, Object value) { 
     if (StringUtils.isBlank((String) value)) { 
      return false; 
     } 
     return User.findByEmail((String) value)); 
    } 

} 

Entonces

 
public class User extends Model { 

@Email 
@Required 
@MaxSize(value = 250) 
@CheckWith(value = UniqueEmail.class, message = "Existing account has been found with this e-mail") 
public String email; 

} 
+0

Un problema de este método es que cuando edito un Registro existente y lo guardo, también me dice que se ha encontrado la cuenta. ¿Cómo puedo permitir que solo se compruebe cuando se crea un nuevo elemento en lugar de modificar un elemento existente? – zjffdu

+0

Comprueba el campo de id, si es nulo, sabes que es un nuevo registro. –

Cuestiones relacionadas