生成器类没有生成方法(名称:“建造”)--Jackson

t3psigkw  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(145)

呼叫objectMapper.convertValue(cityEntity, City.class))时会发生这个错误。

com.fasterxml.Jackson.数据绑定.exc.无效定义异常:生成器类com.example.PostgresApp.dto.City$Builder没有生成方法(名称:“构建”)

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 {

    }
}

调用repo的服务似乎是引发异常的位置

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

gdx19jrr1#

是否确实始终将名称和说明传递给类生成器?
我得到了同样的错误,在我的例子中,我试图使用生成的构建器来创建一个对象,但我没有传递所有的参数,所以生成的方法不是spring正在寻找的方法。它正在搜索N+1个参数的方法,但我只传递了N个参数。在这种情况下,它将寻找一个不同的方法签名,无法找到。

iqxoj9l9

iqxoj9l92#

问题是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的信息,here is a good answer

相关问题