J'ai plusieurs objets de modèle qui utilisent le modèle de générateur que j'essaye de sérialiser avec Jackson à travers Spring MVC. Le problème est, je ne veux pas que la classe de constructeur statique interne soit sérialisée avec la classe externe. J'ai essayé d'utiliser @JsonIgnore sur les méthodes getter individuelles, mais je me retrouve avec un objet vide. J'ai également essayé d'utiliser @JsonIgnoreType sur la classe interne elle-même, mais cela ne semble pas avoir d'effet. Quelqu'un a-t-il une idée sur la façon d'amener Jackson à ignorer une classe interne statique? Merci d'avance.Jackson @JsonIgnoreType ne fonctionne pas sur la classe interne statique
avec Spring 3.2.2 et Jackson 2.2.1
classe simple avec le constructeur
public final class Address {
private final String street;
private final String city;
private final String state;
private Address(Address.Builder addressBuilder) {
street = addressBuilder.street;
city = addressBuilder.city;
state = addressBuilder.state;
}
public static Address.Builder newBuilder() {
return new Address.Builder();
}
@JsonIgnoreType // has no effect
public static final class Builder {
private String street;
private String city;
private String state;
private Builder() {}
public Builder street(String street) {
this.street = street;
return this;
}
...
// Java Beans setters/getters used by Spring
public void setStreet(String street) {
this.street = street;
}
public String getStreet() {
return street;
}
...
public Address build() {
return new Address(this);
}
}
...
}
XML Spring Config
<bean id="jacksonObjectMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false" />
<property name="simpleDateFormat" value="MM/dd/yyyy" />
</bean>
...
<bean id="contentNegotiatingViewResolver" class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" p:order="3">
<property name="defaultViews">
<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" p:objectMapper-ref="jacksonObjectMapper" p:extractValueFromSingleKeyModel="true" />
</property>
</bean>
sérialisation Résultat
{"builder":{"street":"1234 Some street"},"address":{"street":"1234 Some street","city":"Some City","state":"Some State"}}
Résultat attendu
{"street":"1234 Some street","city":"Some City","state":"Some State"}
Voici le contrôleur de ressort qui est utilisé pour renvoyer l'objet Adresse
@Controller
@Validated
@RequestMapping("/address")
public class AddressController extends AbstractController {
@Resource private AddressService addressService;
@RequestMapping("/clean")
public Address cleanAddress(@Validated({AddressGroup.Domestic.class}) Address.Builder address) {
return addressService.cleanAddress(address.build());
}
}
pouvez-vous s'il vous plaît montrer votre code qui passe l'objet à jackson pour la sérialisation? – hoaz
J'ai ajouté le code du contrôleur d'échantillon – Jason
missing @ResponseBody? – hoaz