休息调用时 JsonFormat$Value.hasLenient() 错误
JsonFormat$Value.hasLenient() Error on Rest Call
我正在 Spring Boot 中构建一组微服务。我有一个与数据库接口的服务,并有一系列 RESTful 其他应用程序可以访问的端点。其中许多 table 实体是复杂的对象,作为 JSON 对象提供,但有些是简单的参数,因此作为字符串提供。当我访问主数据库服务端点时,所有数据都正常返回。
我有一系列其他应用程序以各种方式使用这些数据。因为许多对象在应用程序之间重复使用(数据库服务响应形状、个人实体 POJO 等),所以我得到了一个用一些常见的 类 制作的包。每个应用程序导入这些公共 类,然后通过 RestTemplate
调用主数据库服务。因为响应总是以标准方式包装,所以我通过执行交换来获取值,该交换期望响应包装器的 ParameterizedTypeReference
与适当的 POJO 或 Java 变量(字符串、整数等) .
截至 5 个月前,一切都很好。该应用程序已部署到服务器,并且仍在正常运行。但是,我最近返回代码以进行一些修改,现在我发现当我 运行 本地应用程序时,一些端点失败并出现以下错误:
java.lang.NoSuchMethodError: com.fasterxml.jackson.annotation.JsonFormat$Value.hasLenient()Z
一开始我以为这两个 POM 可能不同步,一个正在拉 Jackson 的更新版本,但在对 POM 中的版本进行硬编码后可以 100% 确定它们是相同的(版本 2.10.1 ), 它仍然有同样的问题。还应注意,错误消息中的方法似乎已在 2.9 版中添加,并且截至目前尚未弃用。此错误仅在尝试从返回 POJO 的端点检索数据时发生,而不是在数据类型为字符串时发生。这也可能是相关的,因为数据库服务端点永远不会被击中,所以在抛出错误之前调用似乎从未真正离开应用程序。
知道我为什么会收到此错误以及如何解决它吗?
响应对象:
public class DatabaseServiceResponse<T> {
@JsonInclude(Include.NON_NULL)
private List<T> entities;
@JsonInclude(Include.NON_NULL)
private String error;
[getters and setters ommitted]
}
个人服务:
public List<Person> getPeople() {
List<Person> people = new ArrayList<>();
HttpHeaders headers = getHeaders();
HttpEntity<Object> requestEntity = new HttpEntity<>(null, headers);
ResponseEntity<DatabaseServiceResponse<Person>> response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, new ParamaterizedTypeReference<DatabaseServiceResponse<Person>>() {}); // Fails on this line
if (response.getStatusCode() == HttpStatus.OK) {
people = response.getBody().getEntities();
} else {
throw new ServiceException("Error retrieving people");
}
return people;
}
public List<String> getPersonTypes() {
List<String> personTypes = new ArrayList<>();
HttpHeaders headers = getHeaders();
HttpEntity<Object> requestEntity = new HttpEntity<>(null, headers);
ResponseEntity<DatabaseServiceResponse<String>> response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, new ParamaterizedTypeReference<DatabaseServiceResponse<String>>() {}); // Works fine here
if (response.getStatusCode() == HttpStatus.OK) {
personTypes = response.getBody().getEntities();
} else {
throw new ServiceException("Error retrieving person types");
}
return personTypes;
}
个人应用程序 POM:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath />
</parent>
公共元素 POM:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.1</version>
<scope>provided</scope>
</dependency>
更新
我相信外部库和可能不同步的 POM 文件是一个转移注意力的问题。我已将所有相关 类 复制到主项目中以删除对外部包的依赖,我遇到了同样的问题。我也尝试过将所有版本完全升级到最新版本,但仍然没有成功。 Jackson,无论出于何种原因,都会将 JSON 映射到字符串或字符串列表,但不会将我的 JSON 映射到 POJO。
我 终于 找出了这里的错误,这感觉太荒谬了,我不相信如果没有代码在他们手中,任何人都不会得到正确的答案。只有将所有代码拉回到一个地方,然后通过 Jackson 寻求另一种映射对象的方法(直接使用 ObjectMapper
而不是让 RestTemplate
弄清楚)我偶然发现了真正的问题。
我的 Person 对象上有一个审计 class 属性,它包含创建者、创建日期、修改者、修改日期的正常基本属性。这些日期是标准 ISO-8601 格式的 LocalDateTime
个对象。事实证明,Jackson 无法再将字符串直接处理成 LocalDateTime
对象,需要“帮助”。通过添加将日期作为字符串的 setter 并执行 LocalDateTime.parse(date)
来设置实际的 属性,我现在能够随意成功地到达端点。
我仍然不知道为什么会抛出上面的确切错误,但你知道了。由于没有指定帮助从 String
转换为 LocalDateTime
对象的方法,我收到了来自 Jackson 的 JsonFormat$Value.hasLenient()
错误。
我遇到了类似的问题。
就我而言,@Eyowzitgoin 的回答帮助我解决了问题。我在 jackson 注释上遇到了 maven 依赖冲突。
我正在尝试 运行 一些测试,并且在命令行上一切正常,但 intellij 在知道选择哪个版本时遇到问题。我已明确声明 2.10.3
,但 2.8.5
是通过传递依赖项获取的。
2.10.3
有方法 JsonFormat$Value.hasLenient
,但 2.8.5
没有。
我在 pojo 中的 String 变量上使用 JsonFormat 注释,intellij 期望能够调用该方法,但无法调用。
在我的例子中,我没有解决问题的根源,因为变量应该是 LocalDate,所以我更改了类型并删除了注释,问题就消失了。
我希望如果我保留类型和注释不变,而是解决依赖性问题并确保只有一个版本是 present/declared 问题也会已解决。
我正在 Spring Boot 中构建一组微服务。我有一个与数据库接口的服务,并有一系列 RESTful 其他应用程序可以访问的端点。其中许多 table 实体是复杂的对象,作为 JSON 对象提供,但有些是简单的参数,因此作为字符串提供。当我访问主数据库服务端点时,所有数据都正常返回。
我有一系列其他应用程序以各种方式使用这些数据。因为许多对象在应用程序之间重复使用(数据库服务响应形状、个人实体 POJO 等),所以我得到了一个用一些常见的 类 制作的包。每个应用程序导入这些公共 类,然后通过 RestTemplate
调用主数据库服务。因为响应总是以标准方式包装,所以我通过执行交换来获取值,该交换期望响应包装器的 ParameterizedTypeReference
与适当的 POJO 或 Java 变量(字符串、整数等) .
截至 5 个月前,一切都很好。该应用程序已部署到服务器,并且仍在正常运行。但是,我最近返回代码以进行一些修改,现在我发现当我 运行 本地应用程序时,一些端点失败并出现以下错误:
java.lang.NoSuchMethodError: com.fasterxml.jackson.annotation.JsonFormat$Value.hasLenient()Z
一开始我以为这两个 POM 可能不同步,一个正在拉 Jackson 的更新版本,但在对 POM 中的版本进行硬编码后可以 100% 确定它们是相同的(版本 2.10.1 ), 它仍然有同样的问题。还应注意,错误消息中的方法似乎已在 2.9 版中添加,并且截至目前尚未弃用。此错误仅在尝试从返回 POJO 的端点检索数据时发生,而不是在数据类型为字符串时发生。这也可能是相关的,因为数据库服务端点永远不会被击中,所以在抛出错误之前调用似乎从未真正离开应用程序。
知道我为什么会收到此错误以及如何解决它吗?
响应对象:
public class DatabaseServiceResponse<T> {
@JsonInclude(Include.NON_NULL)
private List<T> entities;
@JsonInclude(Include.NON_NULL)
private String error;
[getters and setters ommitted]
}
个人服务:
public List<Person> getPeople() {
List<Person> people = new ArrayList<>();
HttpHeaders headers = getHeaders();
HttpEntity<Object> requestEntity = new HttpEntity<>(null, headers);
ResponseEntity<DatabaseServiceResponse<Person>> response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, new ParamaterizedTypeReference<DatabaseServiceResponse<Person>>() {}); // Fails on this line
if (response.getStatusCode() == HttpStatus.OK) {
people = response.getBody().getEntities();
} else {
throw new ServiceException("Error retrieving people");
}
return people;
}
public List<String> getPersonTypes() {
List<String> personTypes = new ArrayList<>();
HttpHeaders headers = getHeaders();
HttpEntity<Object> requestEntity = new HttpEntity<>(null, headers);
ResponseEntity<DatabaseServiceResponse<String>> response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, new ParamaterizedTypeReference<DatabaseServiceResponse<String>>() {}); // Works fine here
if (response.getStatusCode() == HttpStatus.OK) {
personTypes = response.getBody().getEntities();
} else {
throw new ServiceException("Error retrieving person types");
}
return personTypes;
}
个人应用程序 POM:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath />
</parent>
公共元素 POM:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.1</version>
<scope>provided</scope>
</dependency>
更新 我相信外部库和可能不同步的 POM 文件是一个转移注意力的问题。我已将所有相关 类 复制到主项目中以删除对外部包的依赖,我遇到了同样的问题。我也尝试过将所有版本完全升级到最新版本,但仍然没有成功。 Jackson,无论出于何种原因,都会将 JSON 映射到字符串或字符串列表,但不会将我的 JSON 映射到 POJO。
我 终于 找出了这里的错误,这感觉太荒谬了,我不相信如果没有代码在他们手中,任何人都不会得到正确的答案。只有将所有代码拉回到一个地方,然后通过 Jackson 寻求另一种映射对象的方法(直接使用 ObjectMapper
而不是让 RestTemplate
弄清楚)我偶然发现了真正的问题。
我的 Person 对象上有一个审计 class 属性,它包含创建者、创建日期、修改者、修改日期的正常基本属性。这些日期是标准 ISO-8601 格式的 LocalDateTime
个对象。事实证明,Jackson 无法再将字符串直接处理成 LocalDateTime
对象,需要“帮助”。通过添加将日期作为字符串的 setter 并执行 LocalDateTime.parse(date)
来设置实际的 属性,我现在能够随意成功地到达端点。
我仍然不知道为什么会抛出上面的确切错误,但你知道了。由于没有指定帮助从 String
转换为 LocalDateTime
对象的方法,我收到了来自 Jackson 的 JsonFormat$Value.hasLenient()
错误。
我遇到了类似的问题。
就我而言,@Eyowzitgoin 的回答帮助我解决了问题。我在 jackson 注释上遇到了 maven 依赖冲突。
我正在尝试 运行 一些测试,并且在命令行上一切正常,但 intellij 在知道选择哪个版本时遇到问题。我已明确声明 2.10.3
,但 2.8.5
是通过传递依赖项获取的。
2.10.3
有方法 JsonFormat$Value.hasLenient
,但 2.8.5
没有。
我在 pojo 中的 String 变量上使用 JsonFormat 注释,intellij 期望能够调用该方法,但无法调用。
在我的例子中,我没有解决问题的根源,因为变量应该是 LocalDate,所以我更改了类型并删除了注释,问题就消失了。
我希望如果我保留类型和注释不变,而是解决依赖性问题并确保只有一个版本是 present/declared 问题也会已解决。