2014-07-04 8 views
6

Sto provando a scrivere un semplice controller Spring Boot che esegue il rendering di un'istanza di GORM e in caso di errore.Rendering classi GORM da Spring Boot

Ecco una versione abbreviata del mio codice:

@RestController 
@RequestMapping("/user") 
class UserController { 
    @RequestMapping(value='/test', method=GET) 
    User test() { 
     return new User(username: 'my test username') 
    } 
} 

ottengo il seguente messaggio di errore:

Could not write JSON: No serializer found for class org.springframework.validation.DefaultMessageCodesResolver and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)) (through reference chain: users.domain.User["errors"]->grails.validation.ValidationErrors["messageCodesResolver"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class org.springframework.validation.DefaultMessageCodesResolver and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)) (through reference chain: users.domain.User["errors"]->grails.validation.ValidationErrors["messageCodesResolver"])

L'errore sembra essere causato da ulteriori proprietà iniettato da GORM. Qual è la soluzione proposta per questo? Questo alla fine sarà risolto in gorm-hibernate4-spring-boot? Devo semplicemente disabilitare SerializationFeature.FAIL_ON_EMPTY_BEANS (non ho molta esperienza con Jackson, quindi non sono del tutto sicuro di quali effetti collaterali possa avere)? Devo usare le annotazioni di Jackson per risolvere il problema? Altre opzioni?

risposta

1

ho trovato un modo per sbarazzarsi di l'errore utilizzando questo codice:

@Component 
class ObjectMapperConfiguration implements InitializingBean { 

    @Autowired 
    ObjectMapper objectMapper 

    @Override 
    void afterPropertiesSet() { 
     def validationErrorsModule = new SimpleModule() 
     validationErrorsModule.addSerializer(ValidationErrors, new ErrorsSerializer()) 
     objectMapper.registerModule(validationErrorsModule) 
    } 

} 

class ErrorsSerializer extends JsonSerializer<ValidationErrors> { 
    @Override 
    void serialize(ValidationErrors errors, JsonGenerator jgen, SerializerProvider provider) { 
     jgen.writeStartObject() 
     jgen.writeEndObject() 
    } 
} 

Ovviamente questa soluzione è ben lungi dall'essere perfetto come armi nucleari semplicemente tutti gli errori di convalida, ma in questo momento è abbastanza buono per me . Sono abbastanza sicuro che il team di Spring Boot dovrà affrontare questo problema alla fine poiché gli oggetti GORM vengono serializzati con alcune proprietà interne di Hibernate come attached. Non accetto questa risposta in quanto non è una soluzione accettabile per la maggior parte degli scenari, fondamentalmente si limita a sopprimere l'eccezione.

0

Questo non ha funzionato per me. Quindi l'ho usato e l'errore è scomparso.

@JsonIgnoreProperties(["errors"]) 
+0

Sto usando Primavera Boot + Groovy per questa applicazione. – dhrubo

0

sto usando springBootVersion '1.4.1.RELEASE' con Gorm & hibernate5:

compile("org.grails:gorm-hibernate5-spring-boot:6.0.3.RELEASE") 

Sto avendo di includere le seguenti nella parte superiore di ogni classe di dominio al fine di utilizzarli in una risposta del client (cioè serializzazione jSON utilizzando Jackson):

@JsonIgnoreProperties(["errors", "metaClass", "dirty", "attached", "dirtyPropertyNames"]) 

Quando si utilizza springBootVersion '1.3.5.RELEASE' sono stato in grado di farla franca:

@JsonIgnoreProperties(["errors"]) 

Questo è in trend nella direzione sbagliata :)