使用 mapstruct 进行映射:错误:(22,48)java:参数“quote”的类型没有名为“quote_type”的属性

Posted

技术标签:

【中文标题】使用 mapstruct 进行映射:错误:(22,48)java:参数“quote”的类型没有名为“quote_type”的属性【英文标题】:Mapping using mapstruct : Error:(22,48) java: The type of parameter "quote" has no property named "quote_type" 【发布时间】:2020-06-29 23:17:45 【问题描述】:

尝试构建映射器类时出现以下错误。

Error:(20,48) java: The type of parameter "quote" has no property named "quote_type".
Error:(15,53) java: Unknown property "quote_type" in return type.
Error:(20,48) java: Property "type" has no write accessor.

Mapper类如下

@Mapper(componentModel = "spring")
public interface SourceDestinationMapper 

    @Mappings(
        @Mapping(target = "quote_type", source= "quoteFromSource.type")
    )
    Quote sourceToDestination(QuoteFromSource quoteFromSource);

    @Mappings(
        @Mapping(target = "type", source = "quote.quote_type")
    )
    QuoteFromSource destinationToSource(Quote quote);

    Value sourceValueToDestinationValue(ValueFromSource valueFromSource);

    ValueFromSource sourceValueToDestinationValue(Value value);

Source 类如下所示

public class Quote 

    @JsonProperty("quote_type")
    private String type;

    @JsonProperty("quote_value")
    private Value value;

Destination 类如下所示

public class QuoteFromSource 

    @JsonProperty("type")
    private String type;

    @JsonProperty("value")
    private ValueFromSource value;

源类

public class Value 

    @JsonProperty("quote_id")
    private Integer id;

    @JsonProperty("quote_description")
    private String quote;

目的地类

public class ValueFromSource 

    @JsonProperty("id")
    private Integer id;

    @JsonProperty("quote")
    private String quote;

要反序列化的 JSON 示例:

 
    "quote_type": "auto",
    "quote_value": 
        "quote_id": 10,
        "quote_description": "This is my first quote"
     

【问题讨论】:

您能否添加一个您尝试反序列化的示例 Json 对象? "quote_type": "auto", "quote_value": "quote_id": 10, "quote_description": "这是我的第一条报价" 【参考方案1】:

我认为你的映射器可能是倒退的。

与您的 JSON 结构直接相关的类是 Quote

该错误使您看起来好像是在尝试反序列化 QuoteFromSource

另外,您需要确保您的类具有标准/默认的 getter 和 setter,因为默认情况下,Jackson 在反序列化时会使用它们,除非您将其配置为直接进行属性注入(非默认)

例子:

public class Quote 

    private String type;

    private Value value;

    @JsonSetter("quote_type")
    public void setType(String type) 
        this.type = type;
    

    @JsonGetter("quote_type")
    public String getType() 
        return type;
    

    @JsonSetter("quote_value")
    public void setValue(Value value) 
        this.value = value;
    

    @JsonGetter("quote_value")
    public Value getValue() 
        return value;
    

【讨论】:

我发现了问题。我使用的是 JsonProperty 名称而不是实际的变量名称。用变量名更改映射器类后,它起作用了。 @Mappings( @Mapping(target = "type", source = "quoteFromSource.type") ) QuoteDestination sourceToDestination(QuoteFromSource quoteFromSource); @Mappings( @Mapping(target = "type", source="quoteDestination.type") )

以上是关于使用 mapstruct 进行映射:错误:(22,48)java:参数“quote”的类型没有名为“quote_type”的属性的主要内容,如果未能解决你的问题,请参考以下文章

使用 MapStruct 时无法映射属性

使用 MapStruct 时无法映射属性

Mapstruct 映射:如果所有源参数属性为空,则返回空对象

Java实体映射工具MapStruct的使用

属性映射工具——MapStruct

属性映射工具——MapStruct