ho incontrato questo problema quando si verifica un controller Primavera utilizzando MockMvc, Mockito e Jackson, così ho fatto una semplice classe per testare come Jackson si comporta. Sto usando jackson-databind: 2.3.1 e mockito-core: 1.9.5.ricorsione infinita durante la serializzazione di oggetti con Jackson e Mockito
Data questa classe:
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 non ha alcun problema serializzazione l'oggetto reale, tuttavia sarà gettare un JsonMappingException quando tenta di serializzare l'oggetto preso in giro. Debug attraverso il codice, chiama ripetutamente serializeFields (bean, jgen, provider), rimanendo bloccato sulle proprietà interne di Mockito.
Quindi, la mia domanda è: Esiste un modo per forzare Jackson a usare i metodi getter? Ho provato @JsonIgnoreProperties sulla classe, @JsonIgnore sui campi e @JsonProperty sui metodi (in diverse combinazioni, senza successo). O devo scrivere il mio serializzatore personalizzato?
Grazie!
Dove sono i metodi Getter? –
Sono nel codice! Li ho appena esclusi per la leggibilità: semplicemente restituiscono semplicemente il valore del campo privato in questo esempio. –
jackson userà il metodo getter ma quelli devono aderire alle convenzioni di denominazione –