Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mapstruct映射查询:将属性从dto映射到实体,而不是dto上的attibute_Java_Entity Framework_Mapstruct - Fatal编程技术网

Java Mapstruct映射查询:将属性从dto映射到实体,而不是dto上的attibute

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

我有一个名为TripEvent(持久性实体)的实体对象。。请看下面我想提请注意的字段是createdby和列表 名单

我的DTO类Dep是通过restful调用的Json有效负载发布的,它看起来像这样

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);
    }
}