jsonformat$value.haslenient()在rest调用时出错

wn9m85ua  于 2021-07-05  发布在  Java
关注(0)|答案(2)|浏览(534)

我正在SpringBoot中构建一组微服务。我有一个与数据库接口的服务,它有一系列restful端点,其他应用程序可以访问这些端点。这些表实体中有许多是复杂的对象,并作为json对象提供,但有些是简单的参数,因此作为字符串提供。当我访问主db服务端点时,所有的数据都会正常返回。
我有一系列其他应用程序,它们以各种方式使用这些数据。因为许多对象是跨应用程序重用的(db服务响应形状、person实体pojo等),所以我得到了一个包含一些公共类的包。每个应用程序导入这些公共类,然后通过 RestTemplate . 因为响应总是以标准方式 Package 的,所以我通过执行一个期望 ParameterizedTypeReference 使用适当的pojo或java变量(string、int等)创建响应 Package 器。
截至5个月前,一切都很好。该应用程序已部署到服务器,目前仍在正常运行。但是,为了进行一些修改,我最近又回到了代码中,现在我发现当我在本地运行应用程序时,一些端点会失败,并出现以下错误:

java.lang.NoSuchMethodError: com.fasterxml.jackson.annotation.JsonFormat$Value.hasLenient()Z

一开始我以为这两个pom可能是不同步的,其中一个正在拉一个更新版本的jackson,但是在pom中硬编码版本以100%确定它们是相同的(版本2.10.1)之后,它仍然有相同的问题。还应该注意,错误消息中的方法似乎是在版本2.9中添加的,到目前为止还没有被弃用。此错误仅在尝试从返回pojo的端点检索数据时发生,而不是在数据类型为字符串时发生。由于db服务端点从未被命中,因此在抛出错误之前,调用似乎从未真正离开应用程序,这也可能是相关的。
你知道我为什么会犯这个错误吗?我该怎么解决?
响应对象:

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都会将jsonMap到字符串或字符串列表,但不会将我的jsonMap到pojo。

rslzwgfq

rslzwgfq1#

我终于找出了这里的问题所在,感觉太荒谬了,我不相信任何人在没有代码的情况下都能得到正确的答案。只需将所有代码拉回到一个地方,然后通过jackson(使用 ObjectMapper 与让 RestTemplate 我偶然发现了真正的问题。
有一个审计类,它是my person对象的一个属性,包含created by、created date、modified by、modified date的常规基本属性。这些日期是 LocalDateTime 标准iso-8601格式的对象。结果证明,Jackson再也不能把琴弦直接加工成琴弦了 LocalDateTime 对象并需要“帮助”。通过添加一个将日期作为字符串并执行 LocalDateTime.parse(date) 要设置实际属性,我现在可以随意成功地命中端点。
我仍然不知道为什么上面的错误会被抛出,但是你已经知道了。不指定帮助从 StringLocalDateTime 对象,我收到了 JsonFormat$Value.hasLenient() Jackson的错误。

anauzrmj

anauzrmj2#

我也有类似的问题。
就我而言,@eyowzitgoin的回答帮助我解决了问题。我在jackson注解上遇到了maven依赖冲突。
我试着运行一些测试,在命令行上一切正常,但是intellij在选择哪个版本时遇到了一个问题。我有 2.10.3 明确声明,但是 2.8.5 是通过一个可传递的依赖项获取的。 2.10.3 有一个方法 JsonFormat$Value.hasLenient ,但是 2.8.5 不。
我在pojo中的一个字符串变量上使用了jsonformat注解,intellij希望能够调用该方法,但未能做到这一点。
在我的例子中,我没有解决问题的根源,因为变量应该是localdate,所以我更改了类型并删除了注解,问题就消失了。
我希望如果我保持类型的原样和注解的位置,而不是解决依赖性问题,并确保只有一个版本存在/声明,那么问题也会得到解决。

相关问题