2016-07-18 31 views
1

Spring MVC ModelAttribute(Person)とJacksonの助けを借りて、HTMLフォームからxmlを作成します。Jackson xmlはシリアル化時に空のオブジェクトを無視します

形態:

.... 
<input name="name"/> 
<input name="birthday"/> 
<input name="address.street/> 
<input name="address.city/> 
.... 

POJO:

@JacksonXmlRootElement(localName = "person") 
@JsonInclude(Include.NON_DEFAULT) 
public class Person implements Serializable { 
    @JsonIgnore 
    private Long id; 
    @JacksonXmlProperty(localName = "name") 
    private String name; 
    @JacksonXmlProperty(localName = "email") 
    private String email; 
    @JacksonXmlProperty(localName = "address") 
    private Address address; 
    private String birthday; 

//getter and setter 

} 

@JsonInclude(Include.NON_EMPTY) 
public class Address implements Serializable { 
    private Long id; 
    private String street; 
    private String streetNumber; 
    private String postalcode; 
    private String city; 

    //getter and setter 
} 

は、コントローラ内のXMLを作成する:

@RequestMapping("saveperson") 
public String savePerson(@ModelAttribute final Person person, final ModelMap model) { 
    final ObjectMapper xmlMapper = new XmlMapper(); 
    final String xml = xmlMapper.writeValueAsString(person); 
    return "redirect:/listpersons"; 
} 

出力XML:

<person> 
     <name>John</name> 
     <email>[email protected]</email> 
     <address/> 
    </person> 

空のオブジェクトをXMLから除外するにはどうすればよいですか?

私はnullにModelAttribute内のすべての空の文字列を設定しようとしました:

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    binder.registerCustomEditor(String.class, new StringTrimmerEditor(true)); 
} 

しかし、それは動作しません。 私も試しました @JsonInclude(Include.NON_EMPTY)と@JsonInclude(Include.NON_NULL) しかし、XMLには常に空のオブジェクトが含まれています。

私の2番目の質問は次のとおりです。アドレスのリストをhtml形式にバインドするとき。これを行う最善の方法は何ですか?

.... 
<input name="name"/> 
<input name="birthday"/> 
<input name="address1.street/> 
<input name="address1.city/> 
<input name="address2.street/> 
<input name="address2.city/> 
.... 

@JacksonXmlRootElement(localName = "person") 
@JsonInclude(Include.NON_DEFAULT) 
public class Person implements Serializable { 
    @JsonIgnore 
    private Long id; 
    @JacksonXmlProperty(localName = "name") 
    private String name; 
    @JacksonXmlProperty(localName = "email") 
    private String email; 
    @JsonIgnore 
    private Address address1; 
    @JsonIgnore 
    private Address address2; 
//add address1 and address2 in the getter or dto for the ModelAttribute? 
    @JacksonXmlElementWrapper(localName = "addresses") 
    @JacksonXmlProperty(localName = "address") 
    private List<Address> address; 
    private String birthday; 

//getter and setter 

} 

ありがとうございます!

答えて

1

ChrisIsHere!

私はちょうどこの問題に遭遇し、誰かが同じ質問をしていたのを見てうれしかったが、誰も反応しなかったことを悲しんだ。

修正した後、XML出力に空の値を含めないことに関する最初の質問に対して2つの解決策が見つかりました。

最初に私のモデルの上に@JsonInclude(JsonInclude.Include.NON_EMPTY)が含まれていました。だから、あなたのため、このような状況で、私はこれが仕事と疑うでしょう:

@JacksonXmlRootElement(localName = "person") 
@JsonInclude(JsonInclude.Include.NON_EMPTY) 
public class Person implements Serializable { 
    @JsonIgnore 
    private Long id; 
    @JacksonXmlProperty(localName = "name") 
    private String name; 
    @JacksonXmlProperty(localName = "email") 
    private String email; 
    @JacksonXmlProperty(localName = "address") 
    private Address address; 
    private String birthday; 

    //getter and setter 
} 

これは、私はあなたがこのルートを行けばなしで生きることを願って、あなたの前のInclude.NON_DEFAULT、と離れて行います。

XmlMapper xmlMapper = new XmlMapper(); 
xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); 

私はこれらのいずれかが10ヶ月遅れて、役に立てば幸い:

第二には、また、私たちはこのように直接XmlMapperを変更する必要がありますこれは、一緒に行きませんでした代替の解決策があるように思われます。

+0

ありがとうございます!それはうまく動作します:-) – chrisishere

関連する問題