java.lang.IllegalArgumentException:没有找到返回类型的转换器

129

使用这段代码

@RequestMapping(value = "/bar/foo", method = RequestMethod.GET)
    public ResponseEntity<foo> foo() {

        Foo model;
        ...
        return ResponseEntity.ok(model);
    }
}
我收到了以下异常
java.lang.IllegalArgumentException: No converter found for return value of type

我的猜测是由于缺少Jackson,该对象无法转换为JSON。我不明白为什么会这样,因为我认为Jackson已经与Spring Boot一起构建了。

然后我尝试将Jackson添加到pom.xml中,但我仍然遇到同样的错误。

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.4.3</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.4.3</version>
</dependency>

我需要更改任何Spring Boot属性才能使它起作用吗?


1
解决方案:https://dev59.com/ElgR5IYBdhLWcg3wHqTB#46977580 - Akshay Vijay Jain
使用中央仓库下载JAR包。 如果您不是Maven用户,您可以在此处找到所需版本的JAR包: http://repo1.maven.org/maven2/com/fasterxml/jackson/core/ - Vivek Mishra
23个回答

355

问题是 Foo 中的嵌套对象之一没有任何 getter/setter


19
只需要使用getter方法。 - Oleksandr Loushkin
5
这也解决了我的问题。如果任何人继续收到转换器错误,最有可能的原因是Jackson无法找到/处理必要的getter。仔细检查你的POJO getter!在我的情况下,我有一个属性的小写getter,而不是期望的驼峰式:getmetaTag()而不是getMetaTag()。 - Michael M
1
还要确保getter/setters是public的!(或者如果您像我一样使用不可变类,请确保您的字段是public final而不仅仅是final - anon
2
谢谢你的回答,它确实有所帮助。但在我的情况下,我将两个相同的JSON属性名称分配给了两个不同的字段。即@JsonProperty("id")... @JsonProperty("id")。看起来每当Jackson序列化程序失败时,就会抛出此错误。 - Aaron
如果您不想添加getter方法,也可以将类属性设置为public。 - Trismegistos
这个答案可能只适用于Spring框架。我几乎可以确定在使用JAX-RS和JBoss时没有遇到这个问题(我认为它使用反射来获取值而不是访问器)。 - TastyWheat

23

请将以下依赖项添加到您的pom.xml文件中:

 <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.10.0.pr3</version>
</dependency>

4
Spring Boot Web Starter默认包含Jackson依赖。 - heemin
是的,但我们需要重写版本,这是必须的。 - Akshay Vijay Jain
2
我认为@heemin是正确的,当使用Spring Boot时,我们不需要单独引入jackson-databing依赖。谢谢。 - Vignesh

17

在错误信息中提到的bean内添加缺失的getter/setter。


13

使用@ResponseBodygetter/setter。希望它能解决你的问题。

@RequestMapping(value = "/bar/foo", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<foo> foo() {

并更新您的mvc-dispatcher-servlet.xml

<mvc:annotation-driven>
     <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
   </mvc:message-converters>
</mvc:annotation-driven>

这是 Spring Boot。我没有 MVC dispatcher servlet。你知道有没有相应的属性吗? - Marc
1
使用 getter/setter 为 foo 类进行操作。 - SkyWalker
我不明白你的意思。问题在于我发送的对象,而不是我接收的对象。没有getter/setter。 - Marc
1
@Marc 我知道这不是你的问题,但是你可以通过在@SpringBootApplication类中添加一个带有@Bean注释的方法的org.springframework.boot.autoconfigure.web.HttpMessageConverters bean来添加消息转换器。你可以通过阅读org.springframework.boot.autoconfigure.web.WebMvcAutoconfiguration类来了解这一点,Spring Boot自动配置代码非常易读,通常是解决此类问题的最快方法。 - UTF_or_Death
2
添加“MappingJackson2HttpMessageConverter”对我有用。谢谢你。我正在使用Spring 4.2.5并遇到了这个问题。我在WebMvcConfigurerAdapter中添加了上述转换器。 - Hemant Nagpal
显示剩余4条评论

8

@Marc所写的答案也是正确的。但具体答案是需要Getter方法,甚至不需要Setter


5

@EnableWebMvc注解在配置类上解决了我的问题。(Spring 5,无web.xml,由AbstractAnnotationConfigDispatcherServletInitializer初始化)


5
在我的情况下,问题发生了,因为 Spring 框架无法获取嵌套对象的属性。Getters/Setters 是一种解决方法,将属性设为 public 是另一种快速而粗略的解决方案,以验证是否真的存在此问题。

3

我曾经遇到同样的错误。我必须确认所有属性都有getter方法,但仍然出现相同的错误。 要解决这个问题,请配置MVC XML(配置文件)。

 <mvc:annotation-driven/>

这是必须的,以便Spring能够检测到jackson的存在并设置相应的转换器。


谢谢,伙计,它起作用了!我只是把它放在applicationContext.xml文件里。 - EACUAMBA

3

我曾经遇到同样的问题,但是通过添加getter方法或添加jackson依赖包都无法解决。

然后我查看了官方的Spring指南,并按照他们在这里提供的示例 https://spring.io/guides/gs/actuator-service/ 进行操作,该示例还展示了如何将返回的对象转换成JSON格式。

接着我又创建了自己的项目,不同之处在于这次我还添加了官方Spring指南示例中的pom.xml文件中的依赖和构建插件。

修改过的XML文件的依赖和构建部分如下所示!

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

你可以在上面提到的链接中看到相同的内容。
神奇的是,至少对我来说,它有效。所以,如果你已经尝试了其他选项但无果,你可能想尝试一下这个方法,就像我的情况一样。
顺便说一下,在我之前的项目中添加依赖项并进行Maven安装和更新项目时,它对我没有起作用。所以,我不得不重新创建我的项目。我并没有太在意,因为我的是一个示例项目,但你也许应该考虑一下这个问题!

2

你没有任何getter/setter方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接