Spring RestController报错:找不到java.lang.Integer返回值的转换器
嘿,我来帮你搞定这个Spring REST服务返回JAXB XML的需求,一步步来,很简单的:
步骤1:创建带JAXB注解的实体类
首先得有一个能被JAXB序列化的实体类,毕竟你要返回XML格式的简历数据嘛。给实体加上JAXB的核心注解,让框架知道怎么把对象转成XML:
import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlElement; import java.util.List; @XmlRootElement(name = "resume") // 指定XML的根节点名称 public class Resume { private Integer id; private String name; private List<String> skills; // JAXB必须要有无参构造函数,别漏了 public Resume() {} public Resume(Integer id, String name) { this.id = id; this.name = name; } @XmlElement // 标记这个字段要被序列化到XML里 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @XmlElement public String getName() { return name; } public void setName(String name) { this.name = name; } @XmlElement(name = "skill") // 给列表元素指定XML标签名 public List<String> getSkills() { return skills; } public void setSkills(List<String> skills) { this.skills = skills; } }
步骤2:修改RestController返回实体
把你原来返回Integer的方法改成返回上面的Resume实体,同时明确指定返回类型是application/xml,这样客户端能清楚知道收到的是XML:
import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; @RestController public class CVIController { // 这里的produces参数明确告诉Spring要返回XML @RequestMapping(value = "/resume", produces = "application/xml") public Resume getResume() { Resume resume = new Resume(5, "John Doe"); List<String> skills = new ArrayList<>(); skills.add("Java"); skills.add("Spring REST"); skills.add("JAXB"); resume.setSkills(skills); return resume; } }
另外提一句:@RestController已经自带了@ResponseBody的功能,所以原来的@ResponseBody可以直接删掉,代码更简洁。
步骤3:确保Spring支持JAXB
Spring默认就支持JAXB序列化,不过要注意JDK版本:
- Java 8及以前:JDK自带JAXB,不用额外加依赖
- Java 9+:JAXB被移除出JDK了,需要在Maven/Gradle里加依赖,比如Maven的话:
<dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.1</version> <scope>runtime</scope> </dependency>
至于你的spring-servlet.xml,只要加上组件扫描就行,让Spring能找到你的Controller:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 替换成你Controller所在的包路径 --> <context:component-scan base-package="com.your.package"/> </beans>
测试效果
启动Spring服务后,访问http://localhost:8080/resume,就能看到类似这样的XML结果了:
<resume> <id>5</id> <name>John Doe</name> <skill>Java</skill> <skill>Spring REST</skill> <skill>JAXB</skill> </resume>
内容的提问来源于stack exchange,提问作者Neok
相关产品推荐
相关产品推荐

