当前位置: 首页 > 知识库问答 >
问题:

如何在Java mapstruct中将参数从列表映射器方法传递到对象映射器方法

邓子濯
2023-03-14

我无法从列表映射器(字符串公司)向对象映射器传递一些公共参数

@Mapper
public abstract class EmployeeMapper {
public abstract Employee getEmployeeFromDTO(EmployeeDTO employeeDTO, String 
company);
@AfterMapping
public void addCompany(@MappingTarget Employee employee, String company) {
   employee.setCompany(company);
}
public abstract List<Employee> getEmployeeFromDTOs(List<EmployeeDTO> employeeDTOs, 
String company);
}

起初,我使用的是接口而不是抽象类。而且没有@AfterMapping方法。事实上,我不知道如何正确地将其作为String公司@Context传递。有没有@Context和@AfterMapping,或者至少有它,所以我的问题是,当列表映射器getEmployeeFromDTO按顺序调用“item”mapper getEmployeeFromDTO时,如何传递“String company”。如果它被传递到最后一种方法,我会很容易地将常见的“公司”映射到员工,@Mapping因为 EmployeeDTO 没有这样的数据。我想另一种方法是使用@Context和@AfterMapping。在这种情况下,我应该把@AfterMapping方法放在相对映射方法之前还是之后?我是否应该将@AfterMapping方法放在 Employee/EmployeeDTO 类中?

共有1个答案

羊冠玉
2023-03-14

以下是我的解决方案:

类别:

public class Message {
    private String level;
    private List<MessageData> messages;
}

public class MessageData {
    private String appId;
    private long dateCreated;
    private String type;
}


public class Event {
    private String type;
    private String processId;
    private List<EventData> events;
}

public class EventData {
    private String name;
    private long dateCreated;
}

解决方案#1:使用上下文

@Mapper
public interface MessageMapper2 {
    @Mapping(target = "level", constant = "MEDIUM")
    @Mapping(target = "messages", source = "event", qualifiedByName = "mapEventsToMessages")
    Message mapEvenToMessage(Event event, @Context String progressId);

    List<MessageData> mapEventsToMessages(List<EventData> events, @Context String progressId);


    @Mapping(target = "type", source = "name")
    @Mapping(target = "appId", expression = "java(progressId)")
    MessageData mapEventDataToMessageData(EventData eventData, @Context String progressId);

}

解决方案#2:如果属性在源对象内部,这个解决方案将会工作

消息数据。appId=event.processId

@Mapper
public interface MessageMapper {

        @Mapping(target = "level", constant = "MEDIUM")
        @Mapping(target = "messages", source = "event", qualifiedByName = "mapEventsToMessages")
        Message mapEvenToMessage(Event event);

        @Named("mapEventsToMessages")
        default List<MessageData> mapEventsToMessages(Event event) {
               return event.getEvents().stream()
                        .map(eventData -> new MessageData(event.getProcessId(), eventData.getDateCreated(), eventData.getName()))
                        .collect(Collectors.toList());
        }
}

 类似资料:
  • 我的RestController中有如下API方法 类如下所示。 在postman中,我传递了一个JSON字符串,如 我得到一个错误说 2021-08-16 18:25:53.953警告4164---[io-8080-exec-10]. w. s. m. s.DefaultHandlerExceptionResolver:已解决[org.springframework.http.converter

  • 例如,我有以下接口映射器: 在代码中,您可以看到映射和一些默认方法,其中包含其他映射。如何在Mapstruct映射中使用这些方法,以便Mapstruct使用这些方法在字段中填充值?

  • 我们有两个相关的下拉列表,其中一个下拉列表的结果与另一个下拉列表相关。 我们定义了一个映射,以映射的形式选择什么,如下所示; 根据上面的地图,当选择“DS”时,我们希望显示“Ärray”和“LL”。其他映射的情况也类似。 我将此映射传递给JSP,并使用JSTL呈现选项。在决定调用JS来填充后续下拉列表时,我想将其更改为JSON。 我想把选定选项的特定映射传递给JS方法,并填充后续的下拉列表。 转换

  • 是否有一种方法可以将封闭的对象引用作为参数传递给映射方法? 在自定义方法中映射person对象时,我需要一个对包围的car对象的引用。

  • 下面是我的DTO。 源DTO 目标DTO

  • ​正如我在这篇文章中看到的,我正试图从YAML文件创建一个服务器对象列表,但是使用Micronaut。 我的YAML文件具有以下配置: 我的POJO是: 我的服务是: 我在系统上设置了一个断点。出来println行并以调试方式启动应用程序,但什么也没发生。 我需要做任何额外的配置吗?