java.lang.IllegalArgumentException:找不到类型为

时间:2016-06-15 16:52:16

标签: java spring spring-boot jackson

使用此代码

@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

我的猜测是,由于杰克逊失踪,该对象无法转换为JSON。我不明白为什么,因为我认为杰克逊是用春季靴子建造的。

然后我尝试将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>

我是否必须更改任何弹簧启动属性才能使其正常工作?

谢谢

20 个答案:

答案 0 :(得分:169)

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

答案 1 :(得分:16)

将以下依赖项添加到您的pom.xml:

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

答案 2 :(得分:8)

添加错误消息中提到的bean内缺少的吸气剂/设置剂。

答案 3 :(得分:5)

使用@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>

答案 4 :(得分:3)

我遇到了同样的问题,遗憾的是,它无法通过添加getter方法或添加jackson依赖项来解决。

然后我查看了官方Spring指南,并按照这里给出的示例 - https://spring.io/guides/gs/actuator-service/ - 其中示例还显示了返回对象到JSON格式的转换。

然后我又创建了自己的项目,区别在于这次我还添加了依赖项并构建了插件,这些插件存在于我上面提到的官方Spring Guide示例的 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安装和更新项目内容时,它对我不起作用。所以,我不得不再次从头开始制作我的项目。我没有太多关于它的事情,因为我的是一个示例项目,但你也可能想要寻找它!

答案 5 :(得分:3)

问题出现在我的情况下,因为spring框架无法获取嵌套对象的属性。 Getters / Setters是解决问题的一种方式。公开属性是另一个快速而肮脏的解决方案,可以验证这确实是问题。

答案 6 :(得分:2)

在使用Spring Boot 2.2时,我遇到了类似的错误消息,并且在搜索错误消息时遇到了

对于带有预设Content-Type'null'的[class java.util.ArrayList]没有转换器

这里的问题排在最前面,但是这里的所有答案都对我不起作用,所以我认为添加我自己的答案是一个好主意:

我必须将以下依赖项添加到pom.xml

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-oxm</artifactId>
</dependency>

<dependency>
  <groupId>com.thoughtworks.xstream</groupId>
  <artifactId>xstream</artifactId>
  <version>1.4.11.1</version>
</dependency>

此后,我需要将以下内容添加到WebApplication类中:

@SpringBootApplication
public class WebApplication
 {
  // ...

  @Bean
  public HttpMessageConverter<Object> createXmlHttpMessageConverter()
   {
    final MarshallingHttpMessageConverter xmlConverter = new MarshallingHttpMessageConverter();
    final XStreamMarshaller xstreamMarshaller = new XStreamMarshaller();
    xstreamMarshaller.setAutodetectAnnotations(true);
    xmlConverter.setMarshaller(xstreamMarshaller);
    xmlConverter.setUnmarshaller(xstreamMarshaller);
    return xmlConverter;
   }

}

最后但并非最不重要的是我使用过的@Controller

@GetMapping(produces = {MediaType.APPLICATION_XML_VALUE, MediaType. APPLICATION_JSON_VALUE})
@ResponseBody
public List<MeterTypeEntity> listXmlJson(final Model model)
 {
  return this.service.list();
 }

因此,现在我根据请求Accept标头获得了JSON和XML返回值。

要使XML输出更具可读性(从标记名称中删除完整的包名称),您还可以在实体类中添加以下内容@XStreamAlias

@Table("ExampleTypes")
@XStreamAlias("ExampleType")
public class ExampleTypeEntity
 {
  // ...
 }

希望这会帮助其他遇到相同问题的人。

答案 7 :(得分:1)

我长时间遇到同样的问题然后才知道必须使用Object Mapper将对象转换为JSON并将其作为 JSON对象传递

@RequestMapping(value = "/getTags", method = RequestMethod.GET)
public @ResponseBody String getTags(@RequestParam String tagName) throws
        JsonGenerationException, JsonMappingException, IOException {
    List<Tag> result = new ArrayList<Tag>();
    for (Tag tag : data) {
        if (tag.getTagName().contains(tagName)) {
            result.add(tag);
        }
    }
    ObjectMapper objectMapper = new ObjectMapper();
    String json = objectMapper.writeValueAsString(result);
    return json;
}

答案 8 :(得分:1)

@Marc编写的答案也是有效的。但是具体的答案是需要Getter方法。您甚至不需要Setter

答案 9 :(得分:1)

您没有任何getter / setter方法。

答案 10 :(得分:0)

在pom.xml中添加以下依赖项:

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.10.1</version>
    </dependency>

面临与返回类型相同的问题,因此无法与Foo类的MediaType绑定。添加依赖项后,它就起作用了。

答案 11 :(得分:0)

就我而言,我在响应实体中返回布尔值 并具有:

produces = MediaType.TEXT_PLAIN_VALUE,

当我将其更改为以下

produces = MediaType.APPLICATION_JSON_VALUE

成功了!

我所拥有的例子。

@PostMapping(value = "/xxx-xxxx",
            produces = MediaType.APPLICATION_JSON_VALUE,
            consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Boolean> yyyy(

答案 12 :(得分:0)

就我而言,我使用的是spring boot,并且遇到类似的错误:

No converter for [class java.util.ArrayList] with preset Content-Type 'null'

证明我有一个

控制器
@GetMapping(produces = { "application/xml", "application/json" })

可耻的是我没有在请求中添加Accept

答案 13 :(得分:0)

我遇到了同样的问题,但是我正在使用Lombok,而我的UploadFileResponse pojo是一个构建器。

public ResponseEntity<UploadFileResponse> 

为解决此问题,我添加了@Getter批注:

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Getter
public class UploadFileResponse

答案 14 :(得分:0)

最近遇到了同样的错误-pojo中有getters / setters,并且所有jackson依赖项都正确地导入了pom中,但是有些人为jackson依赖项“提供了<< scope>”,这引起了问题。从杰克逊依赖项中删除“ ”解决了该问题

答案 15 :(得分:0)

jackson-databind依赖项的范围设置为test时,我看到了相同的错误:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.9</version>
    <scope>test</scope>
</dependency>

删除<scope>行解决了该问题。

答案 16 :(得分:0)

config类上的

@EnableWebMvc注释解决了我的问题。 (春季5,没有web.xml,由AbstractAnnotationConfigDispatcherServletInitializer初始化)

答案 17 :(得分:0)

一段时间我遇到了相同的错误,我已经验证了所有属性都可以使用getter方法,但仍然遇到了相同的错误。 解决问题使用

配置MVC xml(配置)
 <mvc:annotation-driven/>

。Spring需要此功能来检测杰克逊的存在并设置相应的转换器。

答案 18 :(得分:0)

在我的情况下,我忘了添加库jackson-core.jar,我只添加了jackson-annotations.jar和jackson-databind.jar。当我添加jackson-core.jar时,它修复了问题。

答案 19 :(得分:0)

我偶然也会遇到这样的错误,在课堂上的不同属性上放了两个@JsonProperty(&#34; some_value&#34;)相同的行