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

使用java代码而不是mapstruct表达式

黄宏旷
2023-03-14

我正在学习使用MapStruct。

我有以下自定义映射配置,以这种方式将List从JPA实体映射到DTOString

@Mapper(componentModel = "spring")
public interface StatusMapper {

    @Mapping(target = "statusCode",
            expression = "java(entity.getStatuses().get(entity.getStatuses().size() - 1).getStatus())")
    @Mapping(target = "details",
            expression = "java(entity.getStatuses().get(entity.getStatuses().size() - 1).getMessage())")
    StatusResponse map(MyEntity entity);
}

我对这个解决方案的问题是表达式中的Java代码实际上是一个字符串,IDE(例如IntelliJ)没有检查这个“java”代码的语法。也许在重构之后,这段代码将不再工作,因为我重命名了相关字段。

如果我在表达式中添加一个null检查,那么这段代码会更长,更长的代码可能会有更多的打字错误。

我可以在这里写一个真正的java代码,而不是使用这个java表达式字符串吗?

共有1个答案

颜光临
2023-03-14

请记住,MapSTRt是一个注释处理器,用表达式编写的表达式将在生成的Java类中一一写入。因此,进行重构会导致编译错误。

尽管如此,还是有另一种解决方案。

@Mapper(componentModel = "spring")
public interface StatusMapper {

    @Mapping(target = "statusCode", source = "statuses", qualifiedByName = "statusesStatus")
    @Mapping(target = "details", source = "statuses", qualifiedByName = "statusesMessage")
    StatusResponse map(MyEntity entity);

    @Named("statusesStatus")
    default String extractStatus(Collection<Status> statuses) {
        return statuses != null && statuses.isEmpty() ? statuses.get(statuses.get() - 1).getStatus() : null;
    }

    @Named("statusesMessage")
    default String extractStatusMessage(Collection<Status> statuses) {
        return statuses != null && !statuses.isEmpty() ?  statuses.get(statuses.get() - 1).getMessage() : null;
    }
}

这样做将确保MapStruct使用您定义的自定义方法。

另一个可能很好的解决方案(MapStruct中尚不存在)是允许为对象列表建立索引,这是一个开放的功能请求。

潜在的解决方案可能如下所示:

@Mapper(componentModel = "spring")
public interface StatusMapper {

    @Mapping(target = "statusCode", source = "statuses[-1].status")
    @Mapping(target = "details", source = "statuses[-1].message")
    StatusResponse map(MyEntity entity);
}

如果这是你感兴趣的事情,我建议就这个问题进行表决。

 类似资料:
  • 我有一个包含行的文本文件,其中一些行的格式如下: 3个选项卡, 如果几句话之后,最后换行 我需要一个接一个地抓住这些行中的单词(用文本中每个单词的索引) 我想到了一个使用2个正则表达式模式和2个循环的解决方案(添加了下面的代码),但是我想知道是否有更好的解决方案只使用一个正则表达式模式。 以下是文本中的行的示例:

  • 问题内容: 在这里看到讨论之后:Python-产生时差,我很好奇。我最初还以为生成器比列表快,但是当涉及sorted()时我不知道。将生成器表达式发送到sorted()而不是列表有什么好处吗?生成器表达式最终是否仍要在sorted()内放入列表中? 编辑:我只能接受一个答案让我感到悲伤,因为我感到很多答复都有助于澄清这个问题。再次感谢大家。 问题答案: 首先要做的是将数据转换为列表。基本上,实现的

  • 我正在使用Maven和Java Spark构建一个简单的WebService。 pom.xml文件: 当我尝试运行时,我的错误是: 短语使我认为我使用的java版本有问题。以前,我得到了相同的错误,但使用的是,因此我将$JAVA_HOME更改为。这是应该的吗?我的一个同事同意我的观点,即-源应该是1.8。

  • 问题内容: 与JNI相比,JNA似乎更易于调用本机代码。在什么情况下,您将在JNA上使用JNI? 问题答案: JNA不支持c 类的映射,因此,如果您使用的是c 库,则需要一个jni包装器 如果需要大量内存复制。例如,您调用一个返回大字节缓冲区的方法,对其中的内容进行更改,然后需要调用使用此字节缓冲区的另一种方法。这将需要您将该缓冲区从c复制到java,然后再将其从java复制回到c。在这种情况下,

  • 问题内容: 由于各种原因,我试图编写部分动态的HQL查询而不使用Criteria API。我想知道是否有一种简单的方法可以使用HQL表达式来短路where限制。例如,这是正常工作的原始查询: StatusCodes是字符串列表,而orgIds是整数列表。但是,任一个都是可选的,并且不应限制是否传递null而不是传递集合。我试图做到这一点是这样的: 不幸的是,这行不通,但是还有其他方法可以行得通吗,

  • 问题内容: 我有以下代码: 当我通过main方法运行它时,它运行良好,但是当我尝试对其进行编译时,抛出以下错误: 我正在使用Eclipse IDE,并尝试通过命令行进行编译。 问题答案: 默认情况下,使用Java 5来编译类。引用其文档: 还要注意,当前的默认源设置是1.5,默认目标设置是1.5,与运行Maven的JDK无关。如果要更改这些默认值,则应按照设置Java编译器的- source和-t