MapStruct文档(九)

您所在的位置:网站首页 映射需要满足的条件 MapStruct文档(九)

MapStruct文档(九)

2024-07-11 13:07| 来源: 网络整理| 查看: 265

目录

8.1、映射配置继承

8.2、逆映射

8.3、共享配置

8.3.1、MappingInheritanceStrategy.EXPLICIT

8.3.2、MappingInheritanceStrategy.AUTO_INHERIT_FROM_CONFIG

8.3.3、MappingInheritanceStrategy.AUTO_INHERIT_REVERSE_FROM_CONFIG

8.3.4、MappingInheritanceStrategy.AUTO_INHERIT_ALL_FROM_CONFIG

8.1、映射配置继承

@InheritConfiguration可以继承@Mapping,@BeanMapping,@IterableMapping的映射规则。

@InheritConfiguration注解的方法上,有需要映射的字段,它会搜索有相同配置的映射,找到了直接复用此映射;若找到多个方法上都有满足此映射的配置,需要制定@InheritConfiguration#name的值,制定继承方法的映射。

@Data @ToString public class TestPO { private String name; } @Data @ToString public class TestBO { private String nickName; } @Data public class TestTwoBO { private String realName; } @Mapper public interface TestMapper { @Mapping(target = "nickName", source = "name", defaultValue = "nickName") TestBO toTestBO(TestPO testPO); @Mapping(target = "nickName", source = "name", defaultValue = "realName") TestBO toTestTwoBO(TestPO testPO); @InheritConfiguration(name = "toTestTwoBO") TestBO toTestThreeBO(TestPO testPO); } @Component public class TestMapperImpl implements TestMapper { @Override public TestBO toTestBO(TestPO testPO) { if ( testPO == null ) { return null; } TestBO testBO = new TestBO(); if ( testPO.getName() != null ) { testBO.setNickName( testPO.getName() ); } else { testBO.setNickName( "nickName" ); } return testBO; } @Override public TestBO toTestTwoBO(TestPO testPO) { if ( testPO == null ) { return null; } TestBO testBO = new TestBO(); if ( testPO.getName() != null ) { testBO.setNickName( testPO.getName() ); } else { testBO.setNickName( "realName" ); } return testBO; } @Override public TestBO toTestThreeBO(TestPO testPO) { if ( testPO == null ) { return null; } TestBO testBO = new TestBO(); if ( testPO.getName() != null ) { testBO.setNickName( testPO.getName() ); } else { testBO.setNickName( "realName" ); } return testBO; } }

toTestThreeBO的实现方法在设置nickName时,继承的toTestTwoBO方法的映射配置。

8.2、逆映射

当我们定义了一种对象到另一种对象的映射后,可以通过@InheritInverseConfiguration直接进行逆映射。

@Data @ToString public class TestPO { private Long id; private String nameString; private BigDecimal priceString; private Date createTimeString; } @Mapper public interface TestMapper { @Mapping(target = "price", source = "priceString", defaultValue = "-1") @Mapping(target = "name", source = "nameString") @Mapping(target = "createTime", source = "createTimeString", ignore = true) TestBO toTestBO(TestPO testPO); @InheritInverseConfiguration @Mapping(target = "nameString", constant = "namePO") TestPO toTestBO(TestBO testBO); } @Component public class TestMapperImpl implements TestMapper { @Override public TestBO toTestBO(TestPO testPO) { if ( testPO == null ) { return null; } TestBO testBO = new TestBO(); if ( testPO.getPriceString() != null ) { testBO.setPrice( testPO.getPriceString().toString() ); } else { testBO.setPrice( "-1" ); } testBO.setName( testPO.getNameString() ); testBO.setId( testPO.getId() ); return testBO; } @Override public TestPO toTestBO(TestBO testBO) { if ( testBO == null ) { return null; } TestPO testPO = new TestPO(); if ( testBO.getPrice() != null ) { testPO.setPriceString( new BigDecimal( testBO.getPrice() ) ); } testPO.setId( testBO.getId() ); testPO.setNameString( "namePO" ); return testPO; } }

可以看到实现的toTestBO方法中的price->priceString使用的就是toTestPO中priceString->price的逆映射,但是正映射的@Mapping#expression、#defaultExpression、#defaultValue和#constant会被逆映射忽略,就如其中的默认值“-1”在逆映射中不存在;此外某个字段的逆映射可以被ignore,expression或constant覆盖,就如name->nameString;在正映射的createTimeString->createTime上设置了ignore,若此时同时制定了source,则逆映射会继承ignore,不用再重新设置。

@InheritConfiguration的优先级高于@InheritInverseConfiguration。

8.3、共享配置

@MapperConfig注解的接口就是共享配置,可以在@Mapper#config指定共享配置,@MapperConfig中的属性和@Mapper相同,@Mapper中的属性会覆盖@MapperConfig。

共享配置中可以设置原型映射,也可以是父类映射,再通过@MapperConfig、@Mapper的mappingInheritanceStrategy就可以实现原型映射的继承。

mappingInheritanceStrategy的值有:

MappingInheritanceStrategy.EXPLICIT:默认,要想继承原型映射必须使用@InheritConfiguration或@InheritInverseConfiguration注解方法,且此方法的源类型和目标类型要能赋予原型映射类型;

MappingInheritanceStrategy.AUTO_INHERIT_FROM_CONFIG:不需要@InheritConfiguration注解方法,只需要满足类型条件就能继承,但只能是正映射;

MappingInheritanceStrategy.AUTO_INHERIT_REVERSE_FROM_CONFIG:不需要@InheritInverseConfiguration注解方法,只需要满足类型条件就能继承,但只能是逆映射;

MappingInheritanceStrategy.AUTO_INHERIT_ALL_FROM_CONFIG:不需要@InheritInverseConfiguration注解方法,只需要满足类型条件就能继承,正/逆映射都可以。

以上也都要注意映射类型冲突,冲突同样需要指明name属性。

@Data @ToString public class BaseBO { private Long id; private String name; private String createTimeString; } @MapperConfig public interface BaseConfig { @Mapping(target = "createTimeString", source = "createTime") BaseBO toTestBaseBO(BasePO basePO); }

 

8.3.1、MappingInheritanceStrategy.EXPLICIT @Mapper(config = BaseConfig.class, mappingInheritanceStrategy = MappingInheritanceStrategy.EXPLICIT) public interface TestMapper { @InheritConfiguration void updateBO(TestFourPO testFourPO, @MappingTarget TestSixBO testSixBO); @InheritInverseConfiguration(name = "toTestBaseBO") void updatePO(TestSixBO testSixBO, @MappingTarget TestFourPO testFourPO); } @Component public class TestMapperImpl implements TestMapper { @Override public void updateBO(TestFourPO testFourPO, TestSixBO testSixBO) { if ( testFourPO == null ) { return; } if ( testFourPO.getCreateTime() != null ) { testSixBO.setCreateTimeString( new SimpleDateFormat().format( testFourPO.getCreateTime() ) ); } else { testSixBO.setCreateTimeString( null ); } testSixBO.setId( testFourPO.getId() ); testSixBO.setName( testFourPO.getName() ); } @Override public void updatePO(TestSixBO testSixBO, TestFourPO testFourPO) { if ( testSixBO == null ) { return; } try { if ( testSixBO.getCreateTimeString() != null ) { testFourPO.setCreateTime( new SimpleDateFormat().parse( testSixBO.getCreateTimeString() ) ); } else { testFourPO.setCreateTime( null ); } } catch ( ParseException e ) { throw new RuntimeException( e ); } testFourPO.setId( testSixBO.getId() ); testFourPO.setName( testSixBO.getName() ); } }

共享配置的原型映射并不会生成单独的实现方法。

虽然默认继承策略支持正/逆,但是引入共享配置,且mapper中正映射能继承原型映射的情况下,再设置逆映射方法,就必须制定name属性,否则同样有冲突报错。

 

8.3.2、MappingInheritanceStrategy.AUTO_INHERIT_FROM_CONFIG @Mapper(config = BaseConfig.class, mappingInheritanceStrategy = MappingInheritanceStrategy.AUTO_INHERIT_FROM_CONFIG) public interface TestMapper { void updateBO(TestFourPO testFourPO, @MappingTarget TestSixBO testSixBO); } @Component public class TestMapperImpl implements TestMapper { @Override public void updateBO(TestFourPO testFourPO, TestSixBO testSixBO) { if ( testFourPO == null ) { return; } if ( testFourPO.getCreateTime() != null ) { testSixBO.setCreateTimeString( new SimpleDateFormat().format( testFourPO.getCreateTime() ) ); } else { testSixBO.setCreateTimeString( null ); } testSixBO.setId( testFourPO.getId() ); testSixBO.setName( testFourPO.getName() ); } }

 

8.3.3、MappingInheritanceStrategy.AUTO_INHERIT_REVERSE_FROM_CONFIG @Mapper(config = BaseConfig.class, mappingInheritanceStrategy = MappingInheritanceStrategy.AUTO_INHERIT_ALL_FROM_CONFIG) public interface TestMapper { void updatePO(TestSixBO testSixBO, @MappingTarget TestFourPO testFourPO); } @Component public class TestMapperImpl implements TestMapper { @Override public void updatePO(TestSixBO testSixBO, TestFourPO testFourPO) { if ( testSixBO == null ) { return; } try { if ( testSixBO.getCreateTimeString() != null ) { testFourPO.setCreateTime( new SimpleDateFormat().parse( testSixBO.getCreateTimeString() ) ); } else { testFourPO.setCreateTime( null ); } } catch ( ParseException e ) { throw new RuntimeException( e ); } testFourPO.setId( testSixBO.getId() ); testFourPO.setName( testSixBO.getName() ); } }

 

8.3.4、MappingInheritanceStrategy.AUTO_INHERIT_ALL_FROM_CONFIG @Mapper(config = BaseConfig.class, mappingInheritanceStrategy = MappingInheritanceStrategy.AUTO_INHERIT_ALL_FROM_CONFIG) public interface TestMapper { void updateBO(TestFourPO testFourPO, @MappingTarget TestSixBO testSixBO); void updatePO(TestSixBO testSixBO, @MappingTarget TestFourPO testFourPO); } @Component public class TestMapperImpl implements TestMapper { @Override public void updateBO(TestFourPO testFourPO, TestSixBO testSixBO) { if ( testFourPO == null ) { return; } if ( testFourPO.getCreateTime() != null ) { testSixBO.setCreateTimeString( new SimpleDateFormat().format( testFourPO.getCreateTime() ) ); } else { testSixBO.setCreateTimeString( null ); } testSixBO.setId( testFourPO.getId() ); testSixBO.setName( testFourPO.getName() ); } @Override public void updatePO(TestSixBO testSixBO, TestFourPO testFourPO) { if ( testSixBO == null ) { return; } try { if ( testSixBO.getCreateTimeString() != null ) { testFourPO.setCreateTime( new SimpleDateFormat().parse( testSixBO.getCreateTimeString() ) ); } else { testFourPO.setCreateTime( null ); } } catch ( ParseException e ) { throw new RuntimeException( e ); } testFourPO.setId( testSixBO.getId() ); testFourPO.setName( testSixBO.getName() ); } }

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3