生成器类没有构建方法(名称:"构建") - 杰克逊



调用objectMapper.convertValue(cityEntity, City.class))时会发生此错误。

com.fasterxml.jackson.databind.exc.InvalidDefinitionException:生成器类com.example.PostgresApp.dto.City$Builder没有生成方法(名称:"build"(

package com.example.PostgresApp.dto;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import lombok.*;
import org.apache.commons.lang3.StringUtils;

@Value
@Builder(builderClassName = "Builder")
@JsonDeserialize(builder = City.Builder.class)
public class City {
String name;
String description;
@JsonPOJOBuilder(withPrefix = StringUtils.EMPTY)
public static class Builder {
}
}

服务调用回购似乎是抛出异常的地方

public List<City> getCities(){
return cityRepo.findAll().stream().map(cityEntity -> objectMapper
.convertValue(cityEntity, City.class))
.collect(Collectors.toList());
}

问题是Jackson无法反序列化对象值。

我的解决方案是在类中添加以下注释:

// constructor with no args
@NoArgsConstructor(force = true, access = AccessLevel.PRIVATE)
// constructor with all args
@AllArgsConstructor
// ignore unknown properties during deserialization
@JsonIgnoreProperties(ignoreUnknown = true)

我的课最后看起来是这样的:

@Getter
@Builder
@NoArgsConstructor(force = true, access = AccessLevel.PRIVATE)
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyClass {
private boolean flag;
private boolean flag2;
private MyClassA objectA;
private MyClassB objectB;
}

如果你想阅读更多关于为什么我们应该同时使用@NoArgsConstructor@AllArgsConstructor的内容,这里有一个很好的答案。

您确定总是将名称和描述传递给类生成器吗?

我也遇到了同样的错误,在我的例子中,我试图使用生成的生成器来创建一个对象,但我没有传递所有的参数,所以生成的方法不是弹簧想要的。它在搜索N+1个参数的方法,但我只传递了N个参数。在这种情况下,它将查找找不到的不同方法签名。

相关内容

  • 没有找到相关文章

最新更新