当前位置: 首页 > 知识库问答 >
问题:

MapStruct和不变量

黄修永
2023-03-14

我在使地图结构和不可变文件正常工作时遇到问题。

@Value.Immutable
public abstract class FoobarValue {
    public abstract Integer foo();
}
@Value.Immutable
public abstract class TargetFoo {
    public abstract Integer foo();
}
@Mapper
public interface ImmutableMapper {

    ImmutableMapper INSTANCE = Mappers.getMapper(ImmutableMapper.class);

    public TargetFoo toTarget(FoobarValue foobarValue);
}

要测试的主类

public class FoobarValueMain {
    public static void main(String... args) {
        FoobarValue value = ImmutableFoobarValue.builder()
                .foo(2)
                .build();
        ImmutableMapper mapper = ImmutableMapper.INSTANCE;
        System.out.println(mapper.toTarget(value).foo());
    }
}

我得到的错误是

Exception in thread "main" java.lang.IllegalStateException: Cannot build TargetFoo, some of required attributes are not set [foo]
    at org.play.ImmutableTargetFoo$Builder.build(ImmutableTargetFoo.java:158)
    at org.play.ImmutableMapperImpl.toTarget(ImmutableMapperImpl.java:21)
    at org.play.FoobarValueMain.main(FoobarValueMain.java:12)

我的构建。梯度如下

ext {
    mapstructVersion = "1.4.0.Beta2"
    immutablesVersion = "2.8.2"
}

dependencies {
    annotationProcessor "org.immutables:value:$immutablesVersion" // <--- this is important
    annotationProcessor "org.mapstruct:mapstruct-processor:1.4.0.Beta2"

    compileOnly "org.immutables:value:$immutablesVersion"
    implementation "org.mapstruct:mapstruct:${mapstructVersion}"

    testCompile group: 'junit', name: 'junit', version: '4.12'
}

根据参考,这应该都是开箱即用的。我在这里错过了什么?

共有1个答案

濮景龙
2023-03-14

它不起作用的原因是您没有使用JavaBean约定。

您需要在方法前面加get

例如

@Value.Immutable
public abstract class TargetFoo {
    public abstract Integer getFoo();
}
 类似资料:
  • 我们在MapStruct中使用不可变项,在将实体转换为dto时遇到问题。 mapper类 在出现错误的情况下,问题是完全相同的 我检查了mapstruct与不可变的测试,没有什么不同https://github.com/mapstruct/mapstruct/blob/master/integrationtest/src/test/resources/immutablesBuilderTest/m

  • 我有一个用并尝试使用注释。该方法还用注释。将忽略注释。是否可以在Mapstruct方法上使用?

  • 如何在Map结构中完全禁用使用“构建器”?我根本不想使用它们,因为它们会给我带来各种各样的问题。 我在META-INF下创建了服务文件(我更喜欢一种将其分配给映射构建器=的方法,但我没有看到任何如何在代码中正确执行此操作的示例)。 它仍在尝试使用我想映射到的“ModifiableXXX”实例的不可变“构建器”实例。如果可用,我什至采取一种方法将其强制为可修改类型。 在另一个映射中,使用更新Modi

  • 和此映射器(使用Mapstruct): 当我有一个带有空条的MyFoo实例并尝试将其映射到proto时,我会得到一个NullPointerException。 这是因为映射器的自动生成代码为proto调用了一个自动生成的方法,该方法如下所示:

  • 我得到以下情况: 源类: null

  • 使用最新的Springboot和MapStruct版本,并使用Maven构建,我试图实现官方MapStruct网站中给出的“从这里开始”示例 我的代码更简单: pom.xml 汽车JAVA 卡片to.java } 卡马珀。java接口 主要应用 所有代码均在本公开回购协议中:https://github.com/pgbonino/mappertest 运行时,我遇到以下错误: 我在官方的MapSt