我正在使用Mapstruct v1.4.1.Final将Hibernate实体映射到相应的DTO。我使用Spring Boot,所以我的映射器的类具有等于Spring
的组件模型
。
我有2个实体,Person
和Address
。Person
包含一个Address
实例:
人
public class Person {
private String username;
private String name;
private Address address;
}
public class PersonDto {
private String id;
private String name;
private AddressDto address;
private String role;
}
地址
public class Address {
private String addr;
private String city;
}
public class AddressDto {
private String houseAddress;
private String city;
}
这是我写的地图:
地图绘制者
@Mapper(componentModel = "spring")
public interface AddressMapper {
@Mapping(source="person.username", target="userName")
@Mapping(source="address.addr", target="address")
DeliveryAddressDto personAndAddressToDeliveryAddressDto(Person person, Address address);
@Mapping(source="person.username", target="userName")
@Mapping(source="person.address.addr", target="address")
DeliveryAddressDto personToDeliveryAddressDto(Person person);
@Mapping(source = "address.addr", target = "houseAddress")
AddressDto addressToAddressDto(Address address);
@InheritInverseConfiguration(name = "addressToAddressDto")
Address addressDtoToAddress(AddressDto addressDto);
}
@Mapper(componentModel = "spring", uses = {AddressMapper.class})
public interface PersonMapper {
@Mapping(source = "id", target = "username")
@Mapping(source = "address.houseAddress", target = "address.addr")
@Mapping(source = "role", target = "role.id")
Person toPerson(PersonDto personDto);
List<Person> toPeople(List<PersonDto> personDtos);
@InheritInverseConfiguration(name = "toPerson")
PersonDto toPersonDto(Person person);
List<PersonDto> toPeopleDto(List<Person> people);
/**
* update an existing Person with Dto info.
* Set infos on the existing object (Person), without creating a new one.
*/
@Mapping(source = "role", target = "role.id")
void updatePersonFromDto(PersonDto personDto, @MappingTarget Person person);
}
您可以看到,我对< code>PersonMapper说使用< code>AddressMapper来使用它的实现。
但是,为了将地址转换为地址dto,我在PersonMapper
类中找到了另一个实现(与反向映射相同):
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2020-11-21T15:44:55+0100",
comments = "version: 1.4.1.Final, compiler: javac, environment: Java 11 (Oracle Corporation)"
)
@Component
public class AddressMapperImpl implements AddressMapper {
@Override
public DeliveryAddressDto personAndAddressToDeliveryAddressDto(Person person, Address address) {
if ( person == null && address == null ) {
return null;
}
DeliveryAddressDto deliveryAddressDto = new DeliveryAddressDto();
if ( person != null ) {
deliveryAddressDto.setUserName( person.getUsername() );
}
if ( address != null ) {
deliveryAddressDto.setAddress( address.getAddr() );
}
return deliveryAddressDto;
}
@Override
public DeliveryAddressDto personToDeliveryAddressDto(Person person) {
if ( person == null ) {
return null;
}
DeliveryAddressDto deliveryAddressDto = new DeliveryAddressDto();
deliveryAddressDto.setUserName( person.getUsername() );
deliveryAddressDto.setAddress( personAddressAddr( person ) );
return deliveryAddressDto;
}
@Override
public AddressDto addressToAddressDto(Address address) {
if ( address == null ) {
return null;
}
AddressDto addressDto = new AddressDto();
addressDto.setHouseAddress( address.getAddr() );
addressDto.setCity( address.getCity() );
return addressDto;
}
@Override
public Address addressDtoToAddress(AddressDto addressDto) {
if ( addressDto == null ) {
return null;
}
Address address = new Address();
address.setAddr( addressDto.getHouseAddress() );
address.setCity( addressDto.getCity() );
return address;
}
private String personAddressAddr(Person person) {
if ( person == null ) {
return null;
}
Address address = person.getAddress();
if ( address == null ) {
return null;
}
String addr = address.getAddr();
if ( addr == null ) {
return null;
}
return addr;
}
}
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2020-11-21T15:44:55+0100",
comments = "version: 1.4.1.Final, compiler: javac, environment: Java 11 (Oracle Corporation)"
)
@Component
public class PersonMapperImpl implements PersonMapper {
@Autowired
private AddressMapper addressMapper;
@Override
public Person toPerson(PersonDto personDto) {
if ( personDto == null ) {
return null;
}
Person person = new Person();
person.setAddress( addressDtoToAddress1( personDto.getAddress() ) );
person.setRole( personDtoToRole( personDto ) );
person.setUsername( personDto.getId() );
person.setName( personDto.getName() );
return person;
}
@Override
public List<Person> toPeople(List<PersonDto> personDtos) {
if ( personDtos == null ) {
return null;
}
List<Person> list = new ArrayList<Person>( personDtos.size() );
for ( PersonDto personDto : personDtos ) {
list.add( toPerson( personDto ) );
}
return list;
}
@Override
public PersonDto toPersonDto(Person person) {
if ( person == null ) {
return null;
}
PersonDto personDto = new PersonDto();
personDto.setAddress( addressToAddressDto1( person.getAddress() ) );
personDto.setId( person.getUsername() );
personDto.setRole( personRoleId( person ) );
personDto.setName( person.getName() );
return personDto;
}
@Override
public List<PersonDto> toPeopleDto(List<Person> people) {
if ( people == null ) {
return null;
}
List<PersonDto> list = new ArrayList<PersonDto>( people.size() );
for ( Person person : people ) {
list.add( toPersonDto( person ) );
}
return list;
}
@Override
public void updatePersonFromDto(PersonDto personDto, Person person) {
if ( personDto == null ) {
return;
}
if ( person.getRole() == null ) {
person.setRole( new Role() );
}
personDtoToRole1( personDto, person.getRole() );
person.setName( personDto.getName() );
person.setAddress( addressMapper.addressDtoToAddress( personDto.getAddress() ) );
}
protected Address addressDtoToAddress1(AddressDto addressDto) {
if ( addressDto == null ) {
return null;
}
Address address = new Address();
address.setAddr( addressDto.getHouseAddress() );
address.setCity( addressDto.getCity() );
return address;
}
protected Role personDtoToRole(PersonDto personDto) {
if ( personDto == null ) {
return null;
}
Role role = new Role();
role.setId( personDto.getRole() );
return role;
}
protected AddressDto addressToAddressDto1(Address address) {
if ( address == null ) {
return null;
}
AddressDto addressDto = new AddressDto();
addressDto.setHouseAddress( address.getAddr() );
addressDto.setCity( address.getCity() );
return addressDto;
}
private String personRoleId(Person person) {
if ( person == null ) {
return null;
}
Role role = person.getRole();
if ( role == null ) {
return null;
}
String id = role.getId();
if ( id == null ) {
return null;
}
return id;
}
protected void personDtoToRole1(PersonDto personDto, Role mappingTarget) {
if ( personDto == null ) {
return;
}
mappingTarget.setId( personDto.getRole() );
}
}
在此实现中,为什么创建方法地址到地址1()
?为什么不使用地址映射器
实现中提供的地址Dto地址()
?这些方法是相同的。
另请注意,地址映射器
被注入到人员映射器
中,地址映射
器的方法地址DtoAddress()
在方法更新中调用。
您在PERMapper
中两次指定地址映射。
@Mapping(source = "id", target = "username")
@Mapping(source = "address.houseAddress", target = "address.addr")
Person toPerson(PersonDto personDto);
您声明PersonMapper
应该使用AddressMapper
,但是您添加了另一个覆盖映射来手动映射字段。
您只需删除映射,它就会自己找到正确的映射。
@Mapping(source = "id", target = "username")
Person toPerson(PersonDto personDto);
如果要添加显式映射,则需要将源作为PERDto
的地址字段选择为目标Person
的地址字段。下面将给出相同的结果。
@Mapping(source = "id", target = "username")
@Mapping(source = "address", target = "address")
Person toPerson(PersonDto personDto);
它在< code > updatePersonFromDto()中工作得很好,因为您没有添加它的覆盖,它自己从< code>AddressMapper中选取它。如果您向它添加相同的冗余映射,您会注意到相同的行为。
问题内容: 我是Java的新手,我试图找到一种方法来在C语言中存储诸如结构之类的信息。例如,说我想让一名程序雇用员工。它将从用户那里获得一个名字,姓氏和ID号并将其存储起来。然后,用户可以根据条件查看该信息(例如,如果数据库有多于1名员工)。有没有人建议这样做的最佳方法? 问题答案: C中的结构就像Java中的类一样,功能更强大,因为Java中的类可以包含方法,而C ++可以。您创建一个新类。例如
在探索中等维度数据时,经常需要在数据集的不同子集上绘制同一类型图的多个实例。这种技术有时被称为“网格”或“格子”绘图,它与“多重小图”的概念有关。这种技术使查看者从复杂数据中快速提取大量信息。 Matplotlib为绘制这种多轴图提供了很好的支持; seaborn构建于此之上,可直接将绘图结构和数据集结构关系起来。 要使用网格图功能,数据必须在Pandas数据框中,并且必须采用 Hadley Wh
我从quarkus开始,我的构建本机速度太慢(超过一个小时,并已退出内存错误)。我删除了quarkus
问题内容: 我没有找到这样的多图构造…当我想这样做时,我遍历了地图,并填充了多图。还有其他方法吗? 第一个结果是,但我希望 问题答案: 假设你有 那我相信这是最好的 或更佳,但更难阅读
问题内容: 我正在比较测试程序上的两个变体。两者都在具有四个内核的计算机上以4线程运行。 在“模式1”下,我非常类似于执行程序服务来使用池。我把一堆任务扔了进去。与普通的固定线程执行器服务相比,我获得了更好的性能(即使有对Lucene的调用,该调用在其中执行了一些I / O)。 这里没有分而治之。从字面上看,我知道 在“模式2”中,我向池提交一个任务,然后在该任务中调用ForkJoinTask.i
使用亿景智图,您可以生成自己的业务地图,并在线共享和发布这些地图,比如,客户分布图、配送路线图、布局规划图等等。生成一幅地图,基本流程是这样的:新建地图->添加图层->绘制对象(支持批量添加及使用已有数据)->发布地图。这里,为大家介绍,如何构建自定义地图: ● 新建地图 ● 上传Excel/CSV数据 ● 快速添加行政区划 ● 手动绘制地图 ● 搜索添加标注 ● 设置地图名称 ● 设定地图默认视