我正在学习使用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表达式字符串吗?
请记住,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