Java Mapstruct映射查询:将属性从dto映射到实体,而不是dto上的attibute
我有一个名为TripEvent(持久性实体)的实体对象。。请看下面我想提请注意的字段是createdby和列表 名单 我的DTO类Dep是通过restful调用的Json有效负载发布的,它看起来像这样Java Mapstruct映射查询:将属性从dto映射到实体,而不是dto上的attibute,java,entity-framework,mapstruct,Java,Entity Framework,Mapstruct,我有一个名为TripEvent(持久性实体)的实体对象。。请看下面我想提请注意的字段是createdby和列表 名单 我的DTO类Dep是通过restful调用的Json有效负载发布的,它看起来像这样 public class Dep { public Dep(){ } @NotEmpty(message = "seqNo: is a required field") @JsonProperty("seqNo") private String seqNo = nu
public class Dep {
public Dep(){
}
@NotEmpty(message = "seqNo: is a required field")
@JsonProperty("seqNo")
private String seqNo = null;
@NotNull(message = "depTStamp: is a required field")
@JsonProperty("depTStamp")
private ZonedDateTime depTStamp = null;
@NotEmpty(message = "port: is a required field")
@JsonProperty("port")
private String port = null;
@JsonProperty("nonEUPort")
private String nonEUPort = null;
@NotEmpty(message = "activity: is a required field")
@JsonProperty("activity")
private String activity = null;
@JsonProperty("comments")
private String comments = null;
@JsonProperty("spe")
@Valid
private List<DepSpe> spe = new ArrayList<DepSpe>();
@JsonProperty("gea")
@Valid
private List<NonFarGea> gea = new ArrayList<NonFarGea>();
public Dep seqNo(String seqNo) {
this.seqNo = seqNo;
return this;
}
公共类Dep{
公共部门{
}
@NotEmpty(message=“seqNo:是必填字段”)
@JsonProperty(“seqNo”)
私有字符串seqNo=null;
@NotNull(message=“depTStamp:是必填字段”)
@JsonProperty(“depTStamp”)
private ZoneDateTime depTStamp=null;
@NotEmpty(message=“port:是必填字段”)
@JsonProperty(“端口”)
私有字符串端口=null;
@JsonProperty(“非uport”)
私有字符串nonEUPort=null;
@NotEmpty(message=“activity:是必填字段”)
@JsonProperty(“活动”)
私有字符串活动=null;
@JsonProperty(“注释”)
私有字符串注释=null;
@JsonProperty(“spe”)
@有效的
私有列表spe=newarraylist();
@JsonProperty(“gea”)
@有效的
私有列表gea=新的ArrayList();
公共部门序号(字符串序号){
this.seqNo=seqNo;
归还这个;
}
您可以看到,如果这个DTO没有被创建的字段,那么在我的映射类中,您将看到我必须执行的操作,有各种对mappes的调用,这些调用将代码转换为ID等
@Mapper(componentModel="spring",
uses = {
ZonedDateTimeStampMapper.class,
ConfigMapperFromCode.class,
RasDepMapper.class
},
unmappedTargetPolicy = ReportingPolicy.IGNORE
)
public interface DepToTripEventMapperApi {
/*root mapper from a dep dto to a entity trip event*/
@Mappings(
{
@Mapping(target = "createdby", source = "regUserId"),
@Mapping(target = "createdate",expression = "java(java.sql.Timestamp.valueOf(java.time.LocalDateTime.now()))"),
@Mapping(target = "inactiveind", constant = "N"),
@Mapping(target = "eventtypeid", qualifiedByName={"ConfigMapperFromCode", "returnDepEventId"}),
@Mapping(target = "activitytypeid", qualifiedByName={"ConfigMapperFromCode", "activityIdFromCode"}, source="depDto.activity"),
@Mapping(target = "marineportid", qualifiedByName={"ConfigMapperFromCode", "portIdFromCode"}, source = "depDto.port"),
@Mapping(target = "alertind", constant = "N"),
@Mapping(target = "eventnote", source = "depDto.nonEUPort"),
@Mapping(target = "ersseqno", source = "depDto.seqNo"),
@Mapping(target = "skippercomment", source = "depDto.comments"),
@Mapping(target = "tdfiErsmessageid", source = "messageId"),
@Mapping(target = "startdate", source = "depDto.depTStamp"),
@Mapping(target = "completedind", constant = "N"),
@Mapping(target = "vessel", source = "vessell"),
@Mapping(target = "triplogs", source = "tripLogs"),
@Mapping(target = "lastchangedate", ignore = true),
@Mapping(target = "lastchangedby", ignore = true),
@Mapping(target = "tdfiCatchmovements", ignore = true),
@Mapping(target = "tdfiFishgears", source="depDto.gea"),
..
}
)
Tripevent DepDtoToTripEvent(Dep depDto, String regUserId, Long messageId, Vessel vessell, List<Triplog>tripLogs);
// mapper from nonnfargea to fishing gear
@Mappings(
{
@Mapping(target = "meshdimension", source = "gea.gearDims"),
@Mapping(target = "geartypeid", qualifiedByName={"ConfigMapperFromCode", "gearIdFromCode"}, source = "gea.gearType"),
@Mapping(target = "avgnetheight", source = "gea.avNetHeight"),
@Mapping(target = "avgnetlength", source = "gea.avNetLength"),
@Mapping(target = "meshsize", source = "gea.meshSize"),
@Mapping(target = "avghookcount", source = "gea.avHooks"),
@Mapping(target = "totnetquantity", source = "gea.noNets"),
@Mapping(target = "tothookscount", source = "gea.totHooks"),
@Mapping(target = "totnetlength", source = "gea.totLen"),
@Mapping(target = "trawltypeid", qualifiedByName={"ConfigMapperFromCode", "speciesIdFromCode"}, source = "gea.trawlType")
}
)
TdfiFishgear geaToFishGear(NonFarGea gea);
....
...
@Mapper(componentModel=“spring”,
使用={
ZonedDateTimestamper.class,
ConfigMapperFromCode.class,
RasDepMapper.class
},
UnappedTargetPolicy=ReportingPolicy.IGNORE
)
公共接口DepToTripEventMapperApi{
/*从dep dto到实体trip事件的根映射程序*/
@映射(
{
@映射(target=“createdby”,source=“regUserId”),
@映射(target=“createdate”,expression=“java(java.sql.Timestamp.valueOf(java.time.LocalDateTime.now())”,
@映射(target=“inactiveind”,constant=“N”),
@映射(target=“eventtypeid”,qualifiedByName={“ConfigMapperFromCode”,“returnDepEventId”}),
@映射(target=“activitytypeid”,qualifiedByName={“ConfigMapperFromCode”,“activityIdFromCode”},source=“depDto.activity”),
@映射(target=“marineportid”,qualifiedByName={“ConfigMapperFromCode”,“portIdFromCode”},source=“depDto.port”),
@映射(target=“alertind”,constant=“N”),
@映射(target=“eventnote”,source=“depDto.nonEUPort”),
@映射(target=“ersseqno”,source=“depDto.seqNo”),
@映射(target=“skippercomment”,source=“depDto.comments”),
@映射(target=“tdfiErsmessageid”,source=“messageId”),
@映射(target=“startdate”,source=“depDto.depTStamp”),
@映射(target=“completedind”,constant=“N”),
@映射(target=“vessel”,source=“vessell”),
@映射(target=“triplogs”,source=“triplogs”),
@映射(target=“lastchangedate”,ignore=true),
@映射(target=“lastchangedby”,ignore=true),
@映射(target=“tdfiCatchmovements”,ignore=true),
@映射(target=“tdfiFishgears”,source=“depDto.gea”),
..
}
)
Tripevent DepdToTripEvent(Dep depDto、String regUserId、Long messageId、vessell船只、ListtripLogs);
//从非阿根廷到渔具的映射器
@映射(
{
@映射(target=“meshdimension”,source=“gea.gearDims”),
@映射(target=“geartypeid”,qualifiedByName={“ConfigMapperFromCode”,“gearIdFromCode”},source=“gea.gearType”),
@映射(target=“avgnetheight”,source=“gea.avNetHeight”),
@映射(target=“avgnetlength”,source=“gea.avNetLength”),
@映射(target=“meshsize”,source=“gea.meshsize”),
@映射(target=“avghookcount”,source=“gea.avHooks”),
@映射(target=“totnetquantity”,source=“gea.noNets”),
@映射(target=“tothookscont”,source=“gea.totHooks”),
@映射(target=“totnetlength”,source=“gea.totLen”),
@映射(target=“trawltypeid”,qualifiedByName={“ConfigMapperFromCode”,“speciesIdFromCode”},source=“gea.trawlType”)
}
)
TdfiFishgear GEATOFFISHGEAR(非阿根廷gea);
....
...
因此,dto对象之外的字段在实体对象中是必需的,除了这些字段之外,映射工作得非常好
因此,我试图找出如何从depDTo.gea填充一个tdfiFishgears列表,以包含一个createdby字段,该字段不在dto上,但在列表中的所有实例上都是必需的。我通过将它们作为方法(接口)的参数传入,在顶层对此进行了修改…我不想提供一个自定义映射器来循环列表,并手动实例化和映射对象,因为映射与此字段100%分离。我有更多映射
任何想法…我还应该提到,DTO层不能更改,因为它来自另一个团队
这是我在ide中遇到的错误的图像…您可以做的是使用
@AfterMapping
,@BeforeMapping
以及最新的1.2.0(在post Beta2发布时还不是最终版本)@Context
挂钩,以便填充这些字段
它将看起来像:
class ExtraFields {
private String createdBy;
//Getters omitted
}
public interface DepToTripEventMapperApi {
//Your mappings
Tripevent DepDtoToTripEvent(Dep depDto, String regUserId, Long messageId, Vessel vessell, List<Triplog>tripLogs, @Context ExtraFields extra);
//Your mappings
TdfiFishgear geaToFishGear(NonFarGea gea, @Context ExtraFields extra);
@AfterMapping
default void afterMapping(@MappingTarget TdfiFishgear fea, @Context ExtraFields extra) {
fea.setCreatedBy(extra.getCreatedBy());
}
}
谢谢您的回复,在这个更改之后,我得到了一个编译错误……当我将@上下文参数添加到它的接口时,ToIP事件映射器不再识别GeaToFixSead映射器……不能将属性“java. UTILIST GEA”映射到“JavaUTILITUCTTDIFFISHORKS”。考虑声明/实现映射方法:“java. U.T.LIST映射”(java.util.List值)。这是一个TDFIFISHGEAR列表。您需要将
@Context
添加到所有使用geaToFishGear
映射器的映射器中,而不仅仅是映射器本身。它们是在同一映射器中还是在不同的映射器中?您是否也将@Context
添加到DepdtototTripEvent
中?嗨..我添加到了所有映射器(2),有两个映射器一个映射跳闸事件对象(包含齿轮列表),另一个映射器映射列表中的齿轮实例…'tFifishGear GeatFishGear(非齿轮gea
@Mapper(componentModel="spring",
uses = {
ZonedDateTimeStampMapper.class,
ConfigMapperFromCode.class,
RasDepMapper.class
},
unmappedTargetPolicy = ReportingPolicy.IGNORE
)
public interface DepToTripEventMapperApi {
/*root mapper from a dep dto to a entity trip event*/
@Mappings(
{
@Mapping(target = "createdby", source = "regUserId"),
@Mapping(target = "createdate",expression = "java(java.sql.Timestamp.valueOf(java.time.LocalDateTime.now()))"),
@Mapping(target = "inactiveind", constant = "N"),
@Mapping(target = "eventtypeid", qualifiedByName={"ConfigMapperFromCode", "returnDepEventId"}),
@Mapping(target = "activitytypeid", qualifiedByName={"ConfigMapperFromCode", "activityIdFromCode"}, source="depDto.activity"),
@Mapping(target = "marineportid", qualifiedByName={"ConfigMapperFromCode", "portIdFromCode"}, source = "depDto.port"),
@Mapping(target = "alertind", constant = "N"),
@Mapping(target = "eventnote", source = "depDto.nonEUPort"),
@Mapping(target = "ersseqno", source = "depDto.seqNo"),
@Mapping(target = "skippercomment", source = "depDto.comments"),
@Mapping(target = "tdfiErsmessageid", source = "messageId"),
@Mapping(target = "startdate", source = "depDto.depTStamp"),
@Mapping(target = "completedind", constant = "N"),
@Mapping(target = "vessel", source = "vessell"),
@Mapping(target = "triplogs", source = "tripLogs"),
@Mapping(target = "lastchangedate", ignore = true),
@Mapping(target = "lastchangedby", ignore = true),
@Mapping(target = "tdfiCatchmovements", ignore = true),
@Mapping(target = "tdfiFishgears", source="depDto.gea"),
..
}
)
Tripevent DepDtoToTripEvent(Dep depDto, String regUserId, Long messageId, Vessel vessell, List<Triplog>tripLogs);
// mapper from nonnfargea to fishing gear
@Mappings(
{
@Mapping(target = "meshdimension", source = "gea.gearDims"),
@Mapping(target = "geartypeid", qualifiedByName={"ConfigMapperFromCode", "gearIdFromCode"}, source = "gea.gearType"),
@Mapping(target = "avgnetheight", source = "gea.avNetHeight"),
@Mapping(target = "avgnetlength", source = "gea.avNetLength"),
@Mapping(target = "meshsize", source = "gea.meshSize"),
@Mapping(target = "avghookcount", source = "gea.avHooks"),
@Mapping(target = "totnetquantity", source = "gea.noNets"),
@Mapping(target = "tothookscount", source = "gea.totHooks"),
@Mapping(target = "totnetlength", source = "gea.totLen"),
@Mapping(target = "trawltypeid", qualifiedByName={"ConfigMapperFromCode", "speciesIdFromCode"}, source = "gea.trawlType")
}
)
TdfiFishgear geaToFishGear(NonFarGea gea);
....
...
class ExtraFields {
private String createdBy;
//Getters omitted
}
public interface DepToTripEventMapperApi {
//Your mappings
Tripevent DepDtoToTripEvent(Dep depDto, String regUserId, Long messageId, Vessel vessell, List<Triplog>tripLogs, @Context ExtraFields extra);
//Your mappings
TdfiFishgear geaToFishGear(NonFarGea gea, @Context ExtraFields extra);
@AfterMapping
default void afterMapping(@MappingTarget TdfiFishgear fea, @Context ExtraFields extra) {
fea.setCreatedBy(extra.getCreatedBy());
}
}
class ExtraFields {
private String createdBy;
public ExtraField(String createdBy) {
this.createdBy = createdBy;
}
@AfterMapping
public void afterFishGear(@MappingTarget fishGear) {
fishGear.setCreatedBy(createdBy);
}
}