Spring无法在Maven中存在Jackson的情况下转换JSON

Posted

技术标签:

【中文标题】Spring无法在Maven中存在Jackson的情况下转换JSON【英文标题】:Spring unable to convert JSON with Jackson present in maven 【发布时间】:2018-09-05 00:14:27 【问题描述】:

我在 Java Spring 中返回 JSONObject 时遇到问题。我一直在疯狂地搜索,但还没有找到解决方案。

我正在使用 Jackson 的 fasterxml,但我仍然无法让我的 API 以 JSON 格式响应。我将包含我认为有必要提供帮助的文件。

首先,我将展示我的 pom.xml,我认为错误的来源。 Jackson 和另一个依赖项之间可能存在冲突,但我似乎无法弄清楚是哪一个。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>demo</name>
<description>Demo project for Spring Boot</description>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.10.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-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.20</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.vaadin.external.google</groupId>
        <artifactId>android-json</artifactId>
        <version>0.0.20131108.vaadin1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.7.0</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.7.0</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.7.0</version>
    </dependency>
</dependencies>

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

发生错误的控制器如下所示。你应该看看 testMeth2()

@RestController
@RequestMapping(path="/test")
@EnableWebMvc
public class TestController 

@Autowired
private CourseRecommendation courseRecommendation;
@Autowired
private EmployeesRepository employeesRepository;

Employees emp;


@RequestMapping(value = "/check/1", method = RequestMethod.GET)
public @ResponseBody
Employees testMeth1() 
    emp = employeesRepository.findById(1);

    emp.setSex("F");
    employeesRepository.save(emp);

    return emp;
;

@RequestMapping(value = "/check/2", method = RequestMethod.GET)
public @ResponseBody
JSONObject testMeth2() 

    return new JSONObject();



我将在 pastebin 中也包含堆栈跟踪:

https://pastebin.com/5BsEk9C7

这是我正在做的一个实习项目,我们将不胜感激每一点帮助!

干杯。

【问题讨论】:

是否有理由将 Jackson 版本号放入而不是从 spring-boot-parent 继承?可能会弄乱 Jackson 的 AutoConfig 也测试 Meth (lolz) - 我宁愿不.. :) @FattySalami 我都试过了,不过我会改变它:) 从我看到的情况来看,JSONObject 类似乎没有针对某些字段的 getter,因此 Jackson 实际上无法转换它。 ***.com/a/44842806/7770917 【参考方案1】:

我最终只使用了一个 POJO,Spring 为我将它转换为 JSON。这不一样,但它对我的项目来说是一个很好的解决方法。

干杯!

【讨论】:

以上是关于Spring无法在Maven中存在Jackson的情况下转换JSON的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2.3 中带有 Maven 的 Jackson 版本

带有war文件的Maven上的Spring-boot jackson错误,但不是带有com.fasterxml.jackson.core.JsonFactory.requiresPropertyOrd

在 Spring MVC 中,无法使用 Jackson @JsonFormat 将输入绑定到日期字段

Spring Boot:Jackson 不会从“application.properties”中获取配置

Jackson总结:常用注解整合spring自定义JsonSerializer

Spring boot应用失败,Jackson2ObjectMapperBuilder。可见性不存在