2012-10-03 11 views
22

Tengo un método como este:primavera - Creación de una instancia de errores en objetos

public boolean validateMessage(String message, Errors errors) { 
    if (!StringUtils.hasLength(message)) { 
    errors.rejectValue(wrapperName + "message", "EMPTY_MESSAGE", EMPTY_MESSAGE_ERRORMSG) ; 
      return false ; 
     } 
     return true ; 
    } 

Quiero llamar a este método con un nuevo Errors objeto, como:

boolean result = validateMessage("hi", new Errors()) ; 

Sin embargo, este tipo de instancias no está permitido para Errors. Por favor aconséjame.

si no con Errors, puedo lograr esto usando un vacío (nueva) BindingResult

+2

No puede instalar una interfaz. 'BindException',' EscapedErrors' son las clases de implementación. –

+0

Relacionados: http://stackoverflow.com/questions/9744988/writing-junit-tests-for-spring-validator-implementation – Igor

Respuesta

15

Errors y BindingResult son interfaces, por lo tanto, no se pueden crear instancias. Su única opción sería usar una de las clases que implementa Errors.

Puede usar org.springframework.validation.BindException, esto implementa Errors - see here for details.

+1

que no funciona porque 'BindException' no se puede convertir a' Errors' –

+0

Si intento convertirlo, obtengo esto: 'java.lang.ClassCastException: java.net.BindException no se puede convertir en org.springframework.validation .Errors'. Así que, obviamente, no es posible. – th3an0maly

+0

org.springframework.validation.BindException implementa Errors, por lo que debería ser posible. – Jonathan

1

puede crear instancias de objetos de clase. pero Errors es una interfaz, no una clase. por lo tanto, no se puede instanciar como lo intentas hacer.

+0

Pero debería haber alguna forma de evitar esto. ¿Estás diciendo que lo que intento hacer es imposible? :( – th3an0maly

1

El método está esperando un Objeto que implementa la interfaz Errors. Cualquier clase que implemente la interfaz de Errores funcionaría. Si no desea utilizar una clase existente como org.springframework.validation.BindException, puede usar una clase interna anónima. Vea the Spring Docs para las clases existentes que ya implementan Errors. Sin embargo, su clase anónima tendría que poner en práctica todos los métodos de interfaz, que son muy numerosos y hace que su código cada vez más difícil de leer:

boolean result = validateMessage("hi", new Errors() { 

     @Override 
     public void setNestedPath(String nestedPath) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void rejectValue(String field, String errorCode, Object[] errorArgs, String defaultMessage) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void rejectValue(String field, String errorCode, String defaultMessage) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void rejectValue(String field, String errorCode) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void reject(String errorCode, Object[] errorArgs, String defaultMessage) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void reject(String errorCode, String defaultMessage) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void reject(String errorCode) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void pushNestedPath(String subPath) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void popNestedPath() throws IllegalStateException { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public boolean hasGlobalErrors() { 
      // TODO Auto-generated method stub 
      return false; 
     } 

     @Override 
     public boolean hasFieldErrors(String field) { 
      // TODO Auto-generated method stub 
      return false; 
     } 

     @Override 
     public boolean hasFieldErrors() { 
      // TODO Auto-generated method stub 
      return false; 
     } 

     @Override 
     public boolean hasErrors() { 
      // TODO Auto-generated method stub 
      return false; 
     } 

     @Override 
     public String getObjectName() { 
      // TODO Auto-generated method stub 
      return null; 
     } 

     @Override 
     public String getNestedPath() { 
      // TODO Auto-generated method stub 
      return null; 
     } 

     @Override 
     public List<ObjectError> getGlobalErrors() { 
      // TODO Auto-generated method stub 
      return null; 
     } 

     @Override 
     public int getGlobalErrorCount() { 
      // TODO Auto-generated method stub 
      return 0; 
     } 

     @Override 
     public ObjectError getGlobalError() { 
      // TODO Auto-generated method stub 
      return null; 
     } 

     @Override 
     public Object getFieldValue(String field) { 
      // TODO Auto-generated method stub 
      return null; 
     } 

     @Override 
     public Class getFieldType(String field) { 
      // TODO Auto-generated method stub 
      return null; 
     } 

     @Override 
     public List<FieldError> getFieldErrors(String field) { 
      // TODO Auto-generated method stub 
      return null; 
     } 

     @Override 
     public List<FieldError> getFieldErrors() { 
      // TODO Auto-generated method stub 
      return null; 
     } 

     @Override 
     public int getFieldErrorCount(String field) { 
      // TODO Auto-generated method stub 
      return 0; 
     } 

     @Override 
     public int getFieldErrorCount() { 
      // TODO Auto-generated method stub 
      return 0; 
     } 

     @Override 
     public FieldError getFieldError(String field) { 
      // TODO Auto-generated method stub 
      return null; 
     } 

     @Override 
     public FieldError getFieldError() { 
      // TODO Auto-generated method stub 
      return null; 
     } 

     @Override 
     public int getErrorCount() { 
      // TODO Auto-generated method stub 
      return 0; 
     } 

     @Override 
     public List<ObjectError> getAllErrors() { 
      // TODO Auto-generated method stub 
      return null; 
     } 

     @Override 
     public void addAllErrors(Errors errors) { 
      // TODO Auto-generated method stub 

     } 
    }); 
+1

Exactamente la razón por la que estaba buscando una alternativa – th3an0maly

+0

Siempre puede crear su propia clase MyError (ya sea como clase interna o paquete privado o incluso clase pública) e instanciarla cuando quiera usarla. También edité mi respuesta para incluir un enlace a los documentos de Spring que enumeran otras clases de Spring que implementan la interfaz Errors. –

8

Otra opción es utilizar org.springframework.validation.BeanPropertyBindingResult, que implementa errores. Este objeto es de la misma clase de la BindingResult que recibes en los controladores Spring MVC

Errors errors = new BeanPropertyBindingResult(objectToValidate, "objectName"); 
0

Si se trata de una aplicación Spring MVC y está utilizando @Controllers que puede pasar el objeto de validación en forma de org.springframework.validation.BindingResult como parte de el mapeo como tal:

@RequestMapping(value="login.htm", method=RequestMethod.POST) 
public String doLogin(HttpServletRequest request, Model model, BindingResult errors) { 
    // ..... some validation code 

    String message = "My message"; 
    boolean valid = validateMessage(message, errors); 

    // .... some more code 
} 

Esta es una forma alternativa de tener explícitamente instanciar org.springframework.validation.Errors.

Cuestiones relacionadas