我目前正在尝试用 spring 创建我的第一个休息服务,我不希望他返回 XML 结果(基于 JAXB(。
在非常基本的 REST 控制器上:
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@RestController
public class CVIController {
@RequestMapping(value = "/resume")
public @ResponseBody
Integer getResume() {
return 5;
}
}
带有弹簧服务.xml非常空
:<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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="fr.urouen"
/>
<mvc:annotation-driven />
</beans>
还有一个 JDK8 下的 Tomcat 服务器,所以我可以确定默认情况下所有模块都在 JVM 上加载......我抛出了以下异常:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException: No converter found for return value of type: class java.lang.Integer
我不想使用杰克逊,因为我知道JAXB可以处理这个问题。但是在玩弄了我代码的某些部分之后,我仍然找不到为什么她被扔的答案。
编辑 1:
我试图创建一个虚拟类,答案说
public class Dummy {
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
@RestController
public class CVIController {
@RequestMapping(value = "/resume")
public ResponseEntity<Dummy> getResume() {
Dummy dummy = new Dummy();
dummy.setValue(5);
return new ResponseEntity<Dummy>(dummy, HttpStatus.OK);
}
}
但仍然得到完全相同的结果:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException: No converter found for return value of type: class fr.urouen.model.Dummy
最简单的解决方案是返回一个字符串并删除@ResponseBody注释。 根据定义,作为 rest 控制器,返回一个字符串,这就是此特定示例的方法。
如果你想要一个更全面的解决方案,Spring 默认使用 Jackson 来完成从对象到 JSON 的转换。 @ResponseBody会自动执行此操作。
我很确定 Integer 不起作用,因为它不是一个带有 getter 和 setter 的 POJO,也不是可以转换为 JSON 的东西。 即 { 5 } 不是有效的 JSON 对象。
如果你有这样的课程:
public class returnObject() {
private int value;
... getters/setters
}
然后这样做:
@RestController
@ResponseBody
public ReturnObject getValue() {
ReturnObject ret = new ReturnObject();
ret.setValue(5);
return ret;
}
然后你会得到这个:
{ "value" : 5 }
您还需要将杰克逊添加到您的pom中:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.4</version>
</dependency>
ResponseEntity 用于从 restcontroller 返回一些内容,您是否尝试过ResponseEntity
?
@RestController
public class CVIController {
@RequestMapping(value = "/resume")
public @ResponseBody ResponseEntity<?> getResume() {
return ResponseEntity.ok(5);
}
}
或者你可以写
@RestController
public class CVIController {
@RequestMapping(value = "/resume")
public @ResponseBody ResponseEntity<Integer> getResume() {
return new ResponseEntity<Integer>(5, HttpStatus.OK);
}
}
您可以从这里获得更多示例
我也遇到了这个promblem,尝试下载jackson-databind.jar,ackson-core.jar,ackson-annotations.jar并将它们放在您的WEB-INF/lib目录中