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

Mapstruct 1.4.2。最终:NullValuePropertyMappingStrategy。将_设置为_默认值未按预期工作

左丘修齐
2023-03-14

我最近更新了我的Spring启动版本从2.3.0。发布到2.4.4,还更新了地图结构版本从1.3.1到最新版本。最终版本是1.4.2。最终版本。使用的lombok版本-1.18.18

但是其中一个在1.3.1上运行良好的映射器在1.4.2上不再工作,场景如下。

POM:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.4</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    ......

    <properties>
        <!-- used for configuration meta data processor, please keep in sync with 
            spring boot parent version -->
        <spring-boot.version>2.4.4</spring-boot.version>
        <java.version>11</java.version>
        <org.mapstruct.version>1.3.1.Final</org.mapstruct.version>
        .....
    </properties>

    <dependencies>
        ........
        ........
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>${org.mapstruct.version}</version>
        </dependency>
        ........
        ........
    </dependencies>

    <build>
        <finalName>dras_mt</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${org.mapstruct.version}</version>
                        </path>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${lombok.version}</version>
                        </path>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok-mapstruct-binding</artifactId>
                            <version>0.2.0</version>
                        </path>
                        ........
                        ........
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
            ......
            ......
        </plugins>
        <pluginManagement>
            .....
        </pluginManagement>
    </build>
</project> 

实体:

@Entity
@Data
public class TestEntity {
    @Id
    private Long id;

    @NotNull
    private String plntId;

    @NotNull
    private Boolean approvalNeeded = false;
}

域名:

@Value
@Builder(toBuilder = true)
public class TestDomain {
    private PlantDomain plantDomain;

    @NonFinal
    @Setter
    private SomeInfo someInfo;

    @NonFinal
    @Setter
    @Default
    private Boolean approvalNeeded = false;
}

制图员:

@Mapper(componentModel = "spring", uses = { ActaulPlantMapper.class })
public interface TestEntityMapper {
    @Mapping(target = "someInfo", ignore = true)
    @Mapping(source = "plntId", target = "plantDomain")
    @Mapping(target = "approvalNeeded", nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_DEFAULT)
    TestDomain fromEntity(TestEntity entity);    
}

使用MapStruct 1.3.1生成的代码

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2021-03-24T11:33:38+0530",
    comments = "version: 1.3.1.Final, compiler: javac, environment: Java 11.0.9.1 (AdoptOpenJDK)"
)
@Component
public class TestEntityMapperImpl implements TestEntityMapper {

    @Autowired
    private ActualPlantMapper actualPlantMapper;

    @Override
    public TestDomain fromEntity(WareHouseOptionEntity entity) {
        if ( entity == null ) {
            return null;
        }    
        TestDomainBuilder testDomain = TestDomain.builder();
        testDomain.plantDomain( actualPlantMapper.fromSapId( entity.getPlntId() ) );
        if ( entity.getApprovalNeeded() != null ) {
            testDomain.approvalNeeded( entity.getApprovalNeeded() );
        }
        else {
            testDomain.approvalNeeded( false );
        }    
        return testDomain.build();
    }
}

用Map结构1.4.2生成代码

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2021-03-24T11:33:38+0530",
    comments = "version: 1.3.1.Final, compiler: javac, environment: Java 11.0.9.1 (AdoptOpenJDK)"
)
@Component
public class TestEntityMapperImpl implements TestEntityMapper {

    @Autowired
    private ActualPlantMapper actualPlantMapper;

    @Override
    public TestDomain fromEntity(WareHouseOptionEntity entity) {
        if ( entity == null ) {
            return null;
        }    
        TestDomainBuilder testDomain = TestDomain.builder();
        testDomain.plantDomain( actualPlantMapper.fromSapId( entity.getPlntId() ) );            
        testDomain.approvalNeeded( entity.getApprovalNeeded() );               
        return testDomain.build();
    }
}

正如您在1.4.2版本中看到的,NullValue财产映射策略。SET_TO_DEFAULT没有应用。

我尝试过其他选项,比如将NullValuePropertyMappingStrategy放在类级别,但没有起到任何作用。

任何进一步的投入都是高度评估的。

共有1个答案

越嘉茂
2023-03-14

事实上,NullValue属性映射策略在1.3上工作是一个巧合。该策略应该只适用于更新方法,即具有@MappingTarget的方法。

如果你想保持源代码类中定义的默认值,我建议使用NullValueCheckStrategy#ALWAYS

 类似资料:
  • 我尝试使用liquibase使用liquibase“addDefaultValue”语法将我的列的默认值设置为null: 但是向myTable插入新行显示默认值仍然设置为“false”,就像以前一样。所以liquibase更改集不起作用。 如何设置列默认值为null与liquibase?

  • 我将linearlayout背景设置为可绘制文件,以便创建圆角外观: 在我的适配器中,在我膨胀布局项后,我正在尝试将背景颜色更改为“不同”的可绘制对象,以更改背景颜色: 问题是,这样做后,矩形失去了圆角外观,只是一个普通的老正方形。 两个可绘制的:矩形_上角 矩形_上角_高 我遗漏了一些保留圆角的东西?

  • 我试图测试spring rabbitmq confirm callback的行为,根据api描述,如果通过consumer发送了任何否定确认,则confirm callback应该给出ack的false值,但在我的例子中总是给出true。即使我将消息发布到deleted队列,我也在confirm回调中获得了true值。请告诉我如何得到否定的承认。 下面是我如何创建RabbitTemplate be

  • 我正在使用spring Roo并希望访问Controller类中的一个bean,该类在ApplicationContext.xml中具有以下配置: 配置类本身是: 在我的Controller中,我认为一个简单的Autowired注释应该可以完成这项工作 在启动过程中,spring在setSkipWeeks方法中打印消息。不幸的是,每当我在控制器中调用config.getSkipWeeks()时,它

  • 当我运行以下程序时,它只打印 然而,从Java 8的equalsIgnoreCase文档中我们发现: 如果以下至少一项为真,则两个字符c1和c2被视为相同的忽略情况: •对每个字符应用java.lang.character.ToUpperCase(char)方法会产生相同的结果 所以我的问题是为什么这个程序不打印 在这两种操作中,都使用了大写字符。

  • 我试图使用来传输我根据前面的问题设置的自定义标头。 我在文件中读到... 我的属性包括: