hoconvalida Primavera per i parametri RequestBody legati alle collezioni in metodi controller
un'entità:
package org.ibp.soq;
public class MyEntity {
private String field1;
private String field2;
//..getters and setters
}
Validator per l'entità:
package org.ibp.soq;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
@Component
public class MyEntityValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return MyEntity.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
MyEntity myEntity = (MyEntity) target;
// Logic to validate my entity
System.out.print(myEntity);
}
}
e
Il controller REST con metodo PUT di massa:
package org.ibp.soq;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/myEntity")
public class MyEntityRestResource {
@Autowired
private MyEntityValidator myEntityValidator;
@InitBinder
protected void initBinder(final WebDataBinder binder) {
binder.addValidators(this.myEntityValidator);
}
@RequestMapping(method = RequestMethod.PUT)
public void bulkCreate(@RequestBody @Valid List<MyEntity> myEntities) {
// Logic to bulk create entities here.
System.out.print(myEntities);
}
}
Quando faccio una richiesta PUT a questa risorsa con le seguenti corpo della richiesta:
[
{
"field1": "AA",
"field2": "11"
},
{
"field1": "BB",
"field2": "22"
}
]
L'errore che ottengo è:
"Invalid target for Validator [[email protected]b617e]: [[email protected], [email protected]]"
Posso capire che questo è perché MyEntityValidator
"supporta" la convalida singola MyEntity
, non valida zione per ArrayList<MyEntity>
.
MyEntityValidator
funziona perfettamente se ho un singolo oggetto MyEntity
nel corpo della richiesta e un metodo di controllo corrispondente con il parametro @RequestBody @Valid MyEntity myEntity
.
Come è possibile estendere la configurazione del validatore che ho utilizzato per supportare la convalida della raccolta di MyEntity
?
Grazie! Certamente proverò questo approccio. –
Utilizzare \ @ControllerAdvice applicherà CollectionValidator a tutti i controller. Il che causerà l'eccezione "java.lang.IllegalStateException: Target non valido per Validator" se si dispone di un'altra annotazione \ @Valid su oggetto non di raccolta. –
Utilizzare invece \ @InitBinder ("attrName") o fare initBinder in un controller specifico. –