XmlElement(name="custom_name") 在与休息服务集成的 Spring Boot 中不起作用

Posted

技术标签:

【中文标题】XmlElement(name="custom_name") 在与休息服务集成的 Spring Boot 中不起作用【英文标题】:XmlElement(name="custom_name") not working in spring boot integrated with rest services 【发布时间】:2017-04-13 23:26:30 【问题描述】:

我几乎是休息服务世界的新手,在这里我试图更改输出 xml 中显示的字段名称。

不确定,我是否遵循正确的方法,任何帮助都是一件好事。

Activity.java

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Activity 
    
    private int activityId;
    private int duration;
    private String  description;
    
    
    public Activity(int activityId, int duration, String description) 
        super();
        this.activityId = activityId;
        this.duration = duration;
        this.description = description;
    
    
    @XmlElement(name="actvID")
    public int getActivityId() 
        return activityId;
    
    public void setActivityId(int activityId) 
        this.activityId = activityId;
    
    public int getDuration() 
        return duration;
    
    public void setDuration(int duration) 
        this.duration = duration;
    
    public String getDescription() 
        return description;
    
    public void setDescription(String description) 
        this.description = description;
    
    @Override
    public String toString() 
        return "Activity [activityId=" + activityId + ", duration=" + duration + ", description=" + description + "]";
    

ActivityController.java

import java.util.List;
    
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
    
import com.rest.domains.Activity;
import com.rest.services.ActivityService;
    
@Controller
@RequestMapping("/activity")
public class ActivityController 
    
    private ActivityService activityService;
    
    @Autowired
    public void setActivityService(ActivityService activityService) 
        this.activityService = activityService;
    
    
    @RequestMapping(value="/list", method=RequestMethod.GET, produces=MediaType.APPLICATION_XML_VALUE)
    @ResponseBody
    public List<Activity> getAllActivities()
        return activityService.getAllActivities();
    

电流输出

<List>
    <item>
        <activityId>1</activityId>
        <duration>10</duration>
        <description>walking</description>
    </item>
    <item>
        <activityId>2</activityId>
        <duration>20</duration>
        <description>swimming</description>
    </item>
    <item>
        <activityId>3</activityId>
        <duration>30</duration>
        <description>gym</description>
    </item>
</List>

预期输出

从 activityId 到 actvID 的变化

<List>
    <item>
        <actvID>1</actvID>
        <duration>10</duration>
        <description>walking</description>
    </item>
    <item>
        <actvID>2</actvID>
        <duration>20</duration>
        <description>swimming</description>
    </item>
    <item>
        <actvID>3</actvID>
        <duration>30</duration>
        <description>gym</description>
    </item>
</List>

【问题讨论】:

尝试二传手。 @XmlElement(name="actvID") public void setActivityId(int activityId) @ulab 它不起作用。 您找到解决方案了吗?我也面临同样的问题。 不,似乎没人知道! 遇到同样的问题,没想到这么难,应该是个基本功能吧。 【参考方案1】:

我知道这是一个老问题,但我遇到了同样的问题,并通过在MappingJackson2XmlHttpMessageConverter 的对象映射器中注册JaxbAnnotationModule 来解决它:

import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter;

@Configuration
public class XmlConfiguration 

    @Bean
    MappingJackson2XmlHttpMessageConverter getMappingJackson2XmlHttpMessageConverter() 
        var jaxbAnnotationModule = new JaxbAnnotationModule();
        var mappingJackson2XmlHttpMessageConverter = new MappingJackson2XmlHttpMessageConverter();
        mappingJackson2XmlHttpMessageConverter.getObjectMapper().registerModule(jaxbAnnotationModule);
        return mappingJackson2XmlHttpMessageConverter;
    

我还必须添加 maven 依赖项:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.11.3</version>
</dependency>

【讨论】:

【参考方案2】:

很奇怪。 但是,如果您使用 @JsonProperty("actvID") 而不是 @XmlElement(name="actvID") 它适用于 JSON 和 XML。

【讨论】:

【参考方案3】:

这将起作用。在 setter 而不是 getter 中设置 xml 元素名称

@XmlElement(name="Test")
public void setTest

【讨论】:

我无法尝试这个解决方案,因为我的 Java 类都是使用 jaxb20-maven-plugin 生成的,所以我无法更改生成的行为。【参考方案4】:

@Xml* 注释将适用于 Java SE 的 JAXB。如果您有 jackson-dataformat-xml 2.* 依赖项,请删除它并让 JAXB 使用 @Xml* 注释处理映射。 如果你想使用 jackson-dataformat-xml 2.* 那么你必须使用 @Json* 一组 Jackson 注释,它支持 XML 和 JSON 映射。

【讨论】:

【参考方案5】:

到目前为止,这对我有用:

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
@XmlType(propOrder="actvID", "duration", "description")
public class Activity 

private int activityId;
private int duration;
private String  description;


public Activity(int activityId, int duration, String description) 
    super();
    this.activityId = activityId;
    this.duration = duration;
    this.description = description;




// todo - fix this abomination
public String getActvID()  return getActivityId(); 
public void setActvID(String activityId)  setActivityId(activityId); 
// todo - fix this abomination

public int getActivityId()  return activityId; 
public void setActivityId(int activityId)  this.activityId = activityId; 



public int getDuration() 
    return duration;

public void setDuration(int duration) 
    this.duration = duration;

public String getDescription() 
    return description;

public void setDescription(String description) 
    this.description = description;

@Override
public String toString() 
    return "Activity [activityId=" + activityId + ", duration=" + duration + ", description=" + description + "]";


更新: 升级到 jackson 2.8.8spring 4.3.25.RELEASE 后,所有注释都按预期工作。

【讨论】:

以上是关于XmlElement(name="custom_name") 在与休息服务集成的 Spring Boot 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

四、MySQL数据库之通配符

在我的课堂上,我应该在哪里放置@XmlElement 注解?

C#中对xml文件的写操作

WebParam 不允许使用 XmlElement 注释

我需要将 XML 字符串转换为 XmlElement

XMLELEMENT SQL 函数名是不是允许冒号