gpt4 book ai didi

Mapstruct 'aftermapping' 未调用

转载 作者:行者123 更新时间:2023-12-03 17:14:35 25 4
gpt4 key购买 nike

问题是,用 @AfterMapping 注释的方法根本没有被调用。来自 testToEntityMapping它转到 toEntity方法,但它不调用任何 toEntityAfterMapping()方法。为什么 ?是否可以 ?我如何使用 MapStruct 实现这一目标?

(这里我准备了一个没有意义的场景,但它完全捕获了我的问题的本质)
实体:

public class Ford {
private String color;
private String market;
private int totalWidth;

//getters and setters omitted for brevity
}

托斯:
public abstract class FordDto {
public String market;
public String color;

//getters and setters omitted for brevity
}

public class EuropeanFordDto extends FordDto{
private int totalWidth;

public int getTotalWidth() {
return totalWidth + 2;//"+2" for EU market
}
//setter omitted for brevity
}

public class AmericanFordDto extends FordDto{
private int totalWidth;

public int getTotalWidth() {
return totalWidth + 1;//"+1" for US market
}

//setter omitted for brevity
}

映射器:
public abstract class FordMapper<D extends FordDto> {
public Ford toEntity(D dto) {

/* fill in fields common to both ford versions */

final Ford ford = new Ford();

ford.setColor(dto.getColor());
ford.setMarket(dto.getMarket());

return ford;
}
}
@Mapper(componentModel = "spring")
public abstract class EuropeanFordMapper extends FordMapper<EuropeanFordDto> {

@AfterMapping
public void toEntityAfterMapping(final EuropeanFordDto dto, @MappingTarget final Ford entity) {

/* Fill in fields related to european version of the ford */

entity.setTotalWidth(dto.getTotalWidth());
}
}
@Mapper(componentModel = "spring")
public abstract class AmericanFordMapper extends FordMapper<AmericanFordDto> {

@AfterMapping
public void toEntityAfterMapping(final AmericanFordDto dto, @MappingTarget final Ford entity) {

/* Fill in fields related to american version of the ford */

entity.setTotalWidth(dto.getTotalWidth());
}
}

服务:
@Service
public class CarService {

@Autowired
private AmericanFordMapper americanFordMapper;
@Autowired
private EuropeanFordMapper europeanFordMapper;

public void testToEntityMapping(final FordDto dto) {

if (dto instanceof AmericanFordDto) {
americanFordMapper.toEntity((AmericanFordDto) dto);
} else {
europeanFordMapper.toEntity((EuropeanFordDto) dto);
}
}
}

最佳答案

好吧,它比我想象的要简单。

public interface FordMapper<D extends FordDto> {

@Mapping(target = "totalWidth", ignore=true)
public abstract Ford toEntity(D dto);
}
您甚至可以查看 toEntity() 中的实现方法,有一个对 toEntityAfterMapping() 的调用,因此一切都是正确的,并且符合我们想要的结果。

关于Mapstruct 'aftermapping' 未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53687958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com