2016-02-15 11 views
6

Come posso convalidare la mia variabile di percorso in primavera. Voglio convalidare campo id, dal momento che il suo unico singolo campo non voglio passare ad un PojoConvalida @PathVariable nella primavera 4

@RestController 
public class MyController { 
    @RequestMapping(value = "/{id}", method = RequestMethod.PUT) 
    public ResponseEntity method_name(@PathVariable String id) { 
     /// Some code 
    } 
} 

Ho provato a fare l'aggiunta di convalida per la variabile di percorso, ma la sua non ancora lavorando

@RestController 
    @Validated 
public class MyController { 
    @RequestMapping(value = "/{id}", method = RequestMethod.PUT) 
    public ResponseEntity method_name(
      @Valid 
      @Nonnull 
      @Size(max = 2, min = 1, message = "name should have between 1 and 10 characters") 
      @PathVariable String id) { 
    /// Some code 
    } 
} 
+0

almeno non v'è alcun variabile di percorso nel codice nel tuo URL quindi non so che cosa deve essere convalidato ... –

+0

ci dispiace ho perso w hile copia e incolla il codice qui –

+0

Puoi provare semplice if loop nel metodo method_name come if (id == null || id.length() <1 || id.length()> 2) {String message = "nome dovrebbe avere tra 1 e 10 caratteri"; } e puoi restituire ResponseEntity secondo il tuo requisito se il loop risulta essere vero, –

risposta

12

È necessario creare un fagiolo nella configurazione Primavera:

@Bean 
    public MethodValidationPostProcessor methodValidationPostProcessor() { 
     return new MethodValidationPostProcessor(); 
    } 

Si dovrebbe lasciare il @Validated annotazioni sul controller.

E avete bisogno di un Exceptionhandler nella classe MyController per gestire il ConstraintViolationException:

@ExceptionHandler(value = { ConstraintViolationException.class }) 
    @ResponseStatus(value = HttpStatus.BAD_REQUEST) 
    public String handleResourceNotFoundException(ConstraintViolationException e) { 
     Set<ConstraintViolation<?>> violations = e.getConstraintViolations(); 
     StringBuilder strBuilder = new StringBuilder(); 
     for (ConstraintViolation<?> violation : violations) { 
       strBuilder.append(violation.getMessage() + "\n"); 
     } 
     return strBuilder.toString(); 
    } 

Dopo tali modifiche si dovrebbe vedere il messaggio quando i colpi di convalida.

P.S .: Ho appena provato con la convalida @Size.

+0

Ho provato la tua soluzione ma non sembra funzionare. L'unica differenza è che ho il metodo GET. Viene gestito separatamente? –

+0

@NickDiv no dovrebbe essere lo stesso. Cosa non funziona per te? Forse dovresti sollevare una domanda e commentare il link qui. – Patrick

+0

@Patrick: potresti fornire il codice sorgente completo per questo, ho provato ma non è ancora riuscito a convalidare PathVariable – nguyenngoc101

0

Penso che sia un problema di @RequestMapping("/") così Aggiungi @RequestMapping("/") al riposo classe quindi utilizzare @pathVariable

@RestController 
@RequestMapping("/xyz") 
public class MyController { 

    @RequestMapping(value = "/{id}", method = RequestMethod.PUT) 
    public ResponseEntity method_name(@PathVariable String id) { 
     /// Some code 
    } 
} 
0

Per archiviare questo obiettivo ho applicare questa soluzione alternativa per ottenere un messaggio di risposta equivale a una vera e propria Validator:

@GetMapping("/check/email/{email:" + Constants.LOGIN_REGEX + "}") 
@Timed 
public ResponseEntity isValidEmail(@Email @PathVariable(value = "email") String email) { 
    return userService.getUserByEmail(email).map(user -> { 
     Problem problem = Problem.builder() 
      .withType(ErrorConstants.CONSTRAINT_VIOLATION_TYPE) 
      .withTitle("Method argument not valid") 
      .withStatus(Status.BAD_REQUEST) 
      .with("message", ErrorConstants.ERR_VALIDATION) 
      .with("fieldErrors", Arrays.asList(new FieldErrorVM("", "isValidEmail.email", "not unique"))) 
      .build(); 
     return new ResponseEntity(problem, HttpStatus.BAD_REQUEST); 
    }).orElse(
     new ResponseEntity(new UtilsValidatorResponse(EMAIL_VALIDA), HttpStatus.OK) 
    ); 
}