Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson xml在序列化时忽略空对象_Java_Spring Mvc_Jackson - Fatal编程技术网

Java Jackson xml在序列化时忽略空对象

Java Jackson xml在序列化时忽略空对象,java,spring-mvc,jackson,Java,Spring Mvc,Jackson,我想在SpringMVCModelAttribute(Person)和Jackson的帮助下从html表单创建xml 表格: 在控制器中创建XML: @RequestMapping("saveperson") public String savePerson(@ModelAttribute final Person person, final ModelMap model) { final ObjectMapper xmlMapper = new XmlMapper(); fin

我想在SpringMVCModelAttribute(Person)和Jackson的帮助下从html表单创建xml

表格:

在控制器中创建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>john@test.com</email>
        <address/>
    </person>
但它不起作用。 我也试过了 @JsonInclude(Include.NON_EMPTY)和@JsonInclude(Include.NON_NULL) 但它总是在XML中包含空对象

我的第二个问题是:当我想将地址列表绑定到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

}
。。。。
....
@JacksonXmlRootElement(localName=“person”)
@JsonInclude(Include.NON_默认值)
公共类Person实现可序列化{
@杰索尼奥雷
私人长id;
@JacksonXmlProperty(localName=“name”)
私有字符串名称;
@JacksonXmlProperty(localName=“电子邮件”)
私人字符串电子邮件;
@杰索尼奥雷
私人地址1;
@杰索尼奥雷
私人地址2;
//在ModelAttribute的getter或dto中添加address1和address2?
@JacksonXmlElementWrapper(localName=“地址”)
@JacksonXmlProperty(localName=“地址”)
私人名单地址;
私人串生日;
//接二连三
}
谢谢

圣诞老人

我刚刚遇到这个问题,很高兴看到有人问了同样的问题,但很遗憾没有人回答

在修改之后,我为您的第一个问题找到了两种可能的解决方案,即在XML输出中不包含空值

首先是将
@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 xmlMapper = new XmlMapper();
xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);

我希望其中一个能有所帮助,十个月后。

我遇到了完全相反的问题,在模型中,我有空字符串,它被序列化为null:(
....
<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

}
@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 
}
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);