2013-04-15 44 views
16

Tôi có một giao diện đơn giản với getter và setter cho một thuộc tính.Bỏ qua thuộc tính khi deserializing

public interface HasMoney { 

     Money getMoney(); 

     void setMoney(Money money); 

} 

Tôi có một lớp UserAccount khác thực hiện giao diện này.

public class UserAccount implements HasMoney { 

     private Money money; 

     @Override 
     Money getMoney() // fill in the blanks 

     @Override 
     void setMoney(Money money) // fill in the blanks 

} 

Vấn đề của tôi là tôi muốn tuần tự hóa thuộc tính tiền nhưng bỏ qua trong khi deserializing nó, không chấp nhận bất kỳ giá trị nào từ người dùng cho thuộc tính này. Tôi đã thử @JsonIgnore trên setter và @JsonIgnore (false) trên getter, nó bỏ qua nó nhưng nó làm như vậy trong khi serializing nó cũng có.

Tôi đã thử @JsonIgnore trên setter và @JsonProperty trên getter chỉ để nói rõ Jackson rằng chúng tôi dự định theo dõi tài sản này, dường như làm hỏng ứng dụng khi tài sản tiền được gửi tới máy chủ và Jackson cố gắng deserialize nó ném lên MalformedJsonException: không thể xây dựng đối tượng kiểu Money.

Điều đáng sợ nhất là đặt @JsonIgnore trên trình thiết lập và @JsonProperty trên trình thiết lập hoạt động cho hầu hết các trường hợp khi thuộc tính là nguyên thủy.

Trả lời

10

Ok, do đó, hành vi của @JsonIgnore đã được thay đổi hoàn toàn từ 1,9 trở đi (đối với imo tệ hơn). Không đi sâu vào các chi tiết quỷ quái tại sao tài sản của bạn không được bỏ qua trong quá trình deserialization, hãy thử mã này để sửa chữa nó:

public class UserAccount implements HasMoney { 
    @JsonIgnore 
    private BigDecimal money; 

    // Other variable declarations, constructors 

    @Override 
    @JsonProperty 
    public BigDecimal getMoney() { 
     return money; 
    } 

    @JsonIgnore 
    @Override 
    public void setMoney(final BigDecimal money) { 
     this.money = money; 
    } 

    // Other getters/setters 
} 

Lưu ý việc sử dụng @JsonIgnore trên biến lớp học - nó cần thiết cho một giải pháp làm việc.

Lưu ý: tùy thuộc vào môi trường của bạn và trường hợp sử dụng, bạn có thể cần cấu hình thêm về dụ ObjectMapper của bạn, ví dụ, USE_GETTERS_AS_SETTERS, AUTO_DETECT_GETTERS, AUTO_DETECT_SETTERS vv.

+1

Điều này thực sự là một phần của giải pháp. Tôi cũng đã phải thêm objectMapper.disable (MapperFeature.USE_GETTERS_AS_SETTERS) và nó đã làm việc sau đó. Vui lòng chỉnh sửa câu trả lời của bạn và tôi sẽ chấp nhận nó. Buồn của nó là không có cách nào sạch hơn cho điều này (Atleast tôi đã không thể tìm thấy nó). –

+0

@NishantNagwani - odd, hoạt động cho tôi mà không bật tính năng đó. Tôi đang thêm một lưu ý tùy chọn vào câu trả lời của mình nhưng tôi tò mò nếu có điều gì đó khác biệt về thiết lập của bạn sẽ đòi hỏi 'USE_GETTERS_AS_SETTERS'. – Perception

+0

Tôi đã thử lại lần nữa. Không làm việc với môi trường của tôi. Tôi đang sử dụng jackson 2.1.1. Đây là lỗi tôi nhận được { "message": "json không đúng định dạng được chuyển đến máy chủ, loại dữ liệu không đúng được sử dụng: \ nHãy giải quyết deserializing 'setterless' property 'money': get phương thức trả về null (thông qua chuỗi tham chiếu: com.abc. def.Money]) " } –

17

Phiên bản 2.6.0+ cho phép điều này được thực hiện với @JsonIgnoreProperties ở cấp lớp.

@JsonIgnoreProperties(value={ "money" }, allowGetters=true) 

Hãy nhìn vào vấn đề khép kín này: https://github.com/FasterXML/jackson-databind/issues/95

+1

Giải pháp này sạch hơn –

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