Tôi gặp phải vấn đề này khi thử nghiệm một bộ điều khiển Spring sử dụng MockMvc, Mockito và Jackson, vì vậy tôi đã thực hiện một lớp đơn giản để kiểm tra cách Jackson cư xử. Tôi đang sử dụng jackson-databind: 2.3.1 và mockito-core: 1.9.5.Đệ quy đệ quy khi serializing các đối tượng với Jackson và Mockito
Với lớp này:
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.Serializable;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class Person implements Serializable {
private String name;
private int age;
// Public getters and setters...
public static void main(String[] args) {
String name = "Bob";
int age = 21;
ObjectMapper objectMapper = new ObjectMapper();
// attempt serialization with real object
Person person = new Person();
person.setName(name);
person.setAge(age);
try {
System.out.println(objectMapper.writeValueAsString(person));
} catch (JsonProcessingException e) {
e.printStackTrace();
System.err.println("Failed to serialize real object");
}
// attempt serialization with mock object
Person mockPerson = mock(Person.class);
when(mockPerson.getName()).thenReturn(name);
when(mockPerson.getAge()).thenReturn(age);
try {
System.out.println(objectMapper.writeValueAsString(mockPerson));
} catch (JsonProcessingException e) {
e.printStackTrace();
System.err.println("Failed to serialize mock object.");
}
}
Jackson không có vấn đề serializing đối tượng thực tế, tuy nhiên nó sẽ ném một JsonMappingException khi nó cố gắng để serialize các đối tượng chế giễu. Gỡ lỗi thông qua mã, nó gọi serializeFields (đậu, jgen, nhà cung cấp) nhiều lần, bị mắc kẹt trên các thuộc tính Mockito nội bộ.
Vì vậy, câu hỏi của tôi là: Có cách nào để buộc Jackson sử dụng các phương thức getter không? Tôi đã thử @JsonIgnoreProperties trên lớp, @JsonIgnore trên các trường và @JsonProperty trên các phương thức (trong các kết hợp khác nhau, để không thành công). Hoặc, tôi có phải viết bộ chỉnh sửa tùy chỉnh của riêng mình không?
Cảm ơn!
Phương thức getter của bạn ở đâu? –
Họ đang ở trong mã! Tôi chỉ loại trừ chúng để dễ đọc - chúng chỉ đơn giản trả về giá trị của trường riêng trong ví dụ này. –
jackson sẽ sử dụng phương thức getter nhưng những người cần phải tuân thủ các quy ước đặt tên –