2014-07-04 16 views
6

Tôi đang cố gắng viết một bộ điều khiển Khởi động Spring đơn giản để hiển thị một cá thể GORM và không thành công.Hiển thị các lớp GORM từ Spring Boot

Dưới đây là một phiên bản rút gọn của mã của tôi:

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

tôi nhận được thông báo lỗi sau:

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ỗi này có vẻ được gây ra bởi tính thêm tiêm bởi GORM. Giải pháp được đề xuất cho điều này là gì? Điều này cuối cùng sẽ được giải quyết trong gorm-hibernate4-spring-boot? Tôi có nên đơn giản vô hiệu hóa SerializationFeature.FAIL_ON_EMPTY_BEANS (Tôi không có nhiều kinh nghiệm với Jackson vì vậy tôi không hoàn toàn chắc chắn những tác dụng phụ này có thể có)? Tôi có nên sử dụng chú thích của Jackson để giải quyết vấn đề không? Bất kỳ tùy chọn nào khác?

Trả lời

1

Tôi đã tìm thấy một cách để thoát khỏi các lỗi sử dụng mã này:

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

Rõ ràng giải pháp này còn xa mới hoàn hảo như nó chỉ đơn giản là vũ khí hạt nhân tất cả các lỗi xác nhận nhưng ngay bây giờ nó là tốt đủ cho tôi . Tôi khá chắc chắn nhóm Spring Boot sẽ phải giải quyết vấn đề này cuối cùng khi các đối tượng GORM cũng đang được tuần tự hóa với một số thuộc tính Hibernate nội bộ như attached. Tôi không chấp nhận câu trả lời này vì nó không phải là một giải pháp có thể chấp nhận được đối với hầu hết các kịch bản, về cơ bản nó chỉ là viết tắt của ngoại lệ.

0

Điều này không hiệu quả đối với tôi. Vì vậy, tôi đã sử dụng thay vào đó và lỗi biến mất.

@JsonIgnoreProperties(["errors"]) 
+0

Tôi đang sử dụng Spring Boot + Groovy cho ứng dụng này. – dhrubo

0

Tôi đang sử dụng springBootVersion '1.4.1.RELEASE' với GORM & hibernate5:

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

Tôi cần phải bao gồm những điều sau ở phía trên cùng của mỗi lớp miền để sử dụng chúng trong một phản ứng của khách hàng (ví dụ json serialization sử dụng jackson):

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

Khi sử dụng springBootVersion '1.3.5.RELEASE' tôi đã có thể nhận được ngay với:

@JsonIgnoreProperties(["errors"]) 

này có xu hướng theo hướng sai :)

Các vấn đề liên quan