org.springframework.http.converter.HttpMessageNotWritableException 没有找到类型的返回值的转换器:类

Posted

技术标签:

【中文标题】org.springframework.http.converter.HttpMessageNotWritableException 没有找到类型的返回值的转换器:类【英文标题】:org.springframework.http.converter.HttpMessageNotWritableException No converter found for return value of type: class 【发布时间】:2019-04-08 19:51:37 【问题描述】:

我正在使用 Spring-Boot 进行练习,我尝试搜索,但没有找到对我有用的东西。我正在尝试返回转换 POJO 的 JSON,SB 应该自动执行此操作,但它返回:

2018-11-05 13:26:36.090 WARN 1584 --- [nio-8080-exec-1] .wsmsDefaultHandlerExceptionResolver:已解决 [org.springframework.http.converter.HttpMessageNotWritableException:找不到返回值的转换器类型:类 com.example.demo.pelis.Foo]

这是我的 pom.xml:

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.0.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
  </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
    </dependency>
  </dependencies>

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

还有我的 POJO:

public class Foo 

    private String bar;

    /**
     * @return the bar
     */
    public String getBar() 
        return bar;
    

    /**
     * @param bar
     *            the bar to set
     */
    public void setBar(String bar) 
        this.bar = bar;
    

控制器:

@RestController
public class PelisController 
    @GetMapping(value = "/fooPoint")
    public Foo fooPoint() 
        Foo foo = new Foo();
        foo.setBar("smthng");
        return foo;
    

我不知道我做错了什么,因为我尝试过 getters/setters 方法,我试图用官方指南中的那个替换我的 pom。没有任何帮助。

【问题讨论】:

什么版本的春天? 抱歉,忘记发了。这是 2.1.0 版本,我使用的是 Java 8。谢谢! 您是否在请求中设置了Accept: application/json 或任何其他Accept: 标头? 是的,例如:curl -X GET --header "Accept: application/json" localhost:8080/fooPoint -v 我创建了一个与您的项目完全相同的项目,并且成功了。一定是别的东西…… 【参考方案1】:

我今天刚遇到这个问题,花了几个小时才弄清楚问题是什么。我看到的几乎所有答案都是因为缺少 getter 和 setter,将 fastxml 依赖添加到 pom.xml 中。我已经有了 getter 和 setter,我所遵循的教程不需要那些 pom 更改。

mariotepro 的解决方案让我摆脱了这个问题。他的解决方案隐藏在 cmets 之下,所以我决定将其放在答案中,以便人们在遇到相同情况时可以轻松看到它。

所以是的,重申一下,进入我的 maven 存储库并删除 fastxml 文件夹并重新运行 maven 是解决我的问题的方法。

【讨论】:

【参考方案2】:

我认为除了 getter 和 setter 之外,您还需要一个默认的空构造函数,因此只需添加它就可以使其工作。 将它以及 get 和 set 方法添加到所谓的数据类的一种简单方法是使用 Lombok 项目。

一个例子可以在这里找到:

https://github.com/mstine/todo-list/blob/master/src/main/java/io/pivotal/sporing/todos/todolist/TodoItem.java

所以你基本上在 Maven 中添加了依赖,比如:

<!-- For Lombok, data annotations -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

然后你可以使用类中的注解,如 (sn-p):

import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Entity
@Data
@NoArgsConstructor
@Table(name="todo_item")
public class TodoItem 
    @Id
    @GeneratedValue
    private Long id;

注释: @数据 和 @NoArgsConstructor 创建 getter、setter 和空构造函数,这样可以节省样板代码,我认为这很简洁:)。

如果您有兴趣,这里有更多信息: https://projectlombok.org/

【讨论】:

以上是关于org.springframework.http.converter.HttpMessageNotWritableException 没有找到类型的返回值的转换器:类的主要内容,如果未能解决你的问题,请参考以下文章

无法序列化“org.springframework.http.ResponseEntity”HazelcastCache

org.springframework.http.converter.HttpMessageConversionException: T

org.springframework.http.MediaType 中的标记字符“/”无效

Not found org.springframework.http.converter.json.MappingJacksonHttpMessageConverter

Spring 一对多关系抛出异常:org.springframework.http.converter.HttpMessageNotWritableException

org.springframework.http.converter.HttpMessageNotWritableException 没有找到类型的返回值的转换器:类