2012-10-03 7 views
22

Ho un metodo come questo:Spring - di un'istanza di un Errori obiettare

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

voglio chiamare questo metodo con un nuovo Errors oggetto, come:

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

Tuttavia, questo tipo di esemplificazione non è consentito per Errors. Per favore consiglio

se non con Errors, posso farlo con un vuoto (nuovo) BindingResult

+2

Non è possibile instaziare un'interfaccia. 'BindException',' EscapedErrors' sono le classi di implementazione. –

+0

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

risposta

15

Errors e BindingResult sono interfacce, pertanto non possono essere istanziate. La tua unica opzione sarebbe quella di utilizzare una delle classi che implementa Errors.

È possibile utilizzare org.springframework.validation.BindException, questo strumento Errors - see here for details.

+1

che non funziona perché 'BindException' non può essere gettato a' Errors' –

+0

se provo il cast, ottengo questo: 'java.lang.ClassCastException: java.net.BindException non può essere gettato a org.springframework.validation . .Errors' così, ovviamente, non è possibile – th3an0maly

+0

org.springframework.validation.BindException implementa errori, quindi dovrebbe essere possibile – Jonathan

1

è possibile creare un'istanza oggetti di classe. ma Errors è un'interfaccia, non una classe. quindi, non può essere istanziato come si sta tentando di fare.

+0

Ma ci dovrebbe essere un modo per aggirare questo. Stai dicendo che quello che sto cercando di fare è impossibile? :( – th3an0maly

1

Il metodo si aspetta un oggetto che implementa l'interfaccia Errors. Funzionerebbe qualsiasi classe che implementasse l'interfaccia Errori. Se non si desidera utilizzare una classe esistente come org.springframework.validation.BindException, è possibile utilizzare una classe interna anonima. Vedi the Spring Docs per le classi esistenti che già implementano Errors. Ma la vostra classe anonima avrebbe bisogno di implementare tutti i metodi di interfaccia, che sono abbastanza numerosi e rende il codice più difficile da leggere:

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

Esattamente il motivo per cui stavo cercando un'alternativa – th3an0maly

+0

È sempre possibile creare la propria classe MyError (come classe interna o pacchetto privato o anche classe pubblica) e creare un'istanza che quando si desidera utilizzarla. Ho anche modificato la mia risposta per includere un collegamento ai documenti Spring che elencano altre classi Spring che implementano l'interfaccia Errors –

8

Un'altra opzione è quella di utilizzare org.springframework.validation.BeanPropertyBindingResult, che implementa errori. Questo oggetto è della stessa classe della BindingResult si riceve nel controller Spring MVC

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

Se si tratta di un'applicazione Spring MVC e si utilizza @Controllers si può passare l'oggetto di convalida sotto forma di org.springframework.validation.BindingResult come parte di la mappatura in quanto tale:

@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 
} 

Questo è un modo alternativo di ad avere in modo esplicito un'istanza org.springframework.validation.Errors.

Problemi correlati