Reputation: 554
I am almost new to rest services world,here i am trying to change the field name displayed in the output xml.
Not sure,am i following the right method,any help is a good thing.
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();
}
}
Current Output
<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>
Expected output
Changes from activityId to 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>
Upvotes: 9
Views: 9172
Reputation: 7330
Use Jackson annotations instead javax/jakarta ones.
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
@JacksonXmlRootElement(localName = "customClassName")
public MyClass {
@JacksonXmlProperty(localName = "customFieldName")
private String myField;
....
}
Upvotes: 0
Reputation: 218
@Xml* annotations will work with Java SE's JAXB. If you have jackson-dataformat-xml 2.* dependency remove that and let JAXB handles mapping using @Xml* annotations. If you want to use jackson-dataformat-xml 2.* then you have to use @Json* set of Jackson annotations which will support both XML and JSON mappings.
Upvotes: 2
Reputation: 110
This will work .set the xml element name in setter instead of getter
@XmlElement(name="Test")
public void setTest
Upvotes: 1
Reputation: 2464
I know it's an old question but I encountered the same problem and solved it by registering a JaxbAnnotationModule
in the object mapper of MappingJackson2XmlHttpMessageConverter
:
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;
}
}
I also had to add the maven dependency:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.11.3</version>
</dependency>
Upvotes: 4
Reputation:
This worked for me so far:
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 + "]";
}
}
UPDATE: after upgrading to jackson 2.8.8 and spring 4.3.25.RELEASE all the annotations worked as supposed.
Upvotes: 0
Reputation: 131
Very strange. But if you use @JsonProperty("actvID") instead of @XmlElement(name="actvID") it works for both JSON as well as XML.
Upvotes: 1