2013-05-20 3 views
0

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()); 
    } 
} 
+0

pouvez-vous s'il vous plaît montrer votre code qui passe l'objet à jackson pour la sérialisation? – hoaz

+0

J'ai ajouté le code du contrôleur d'échantillon – Jason

+1

missing @ResponseBody? – hoaz

Répondre

1

Vous manquez @ResponseBody dans votre méthode de gestionnaire du contrôleur.

Questions connexes