问:mapstruct 能否理解一个表达式 returns 一个 String,以便它可以使用我提供的 dateFormat?
Q: Can mapstruct understand that an expression returns a String so that it can use my dateFormat I provide?
我试图让 Mapstruct 理解源表达式是一个可以格式化为 java.util.LocalDate 的字符串,但我不确定我做的是否正确。我尝试按照 mapstruct 文档中的说明进行操作。
@Mapping(componentModel = "cdi", uses=DateMapper.class)
public abstract class RedactedClassName
@Mapping(target = "birthDate",
expression = "java(fileLine.substring(redactedpackagename.Constants.BIRTH_DATE_START_POS, redatcedpackagename.Constants.BIRTH_DATE_END_POS))")
abstract PersonBio fileLineToPersonBio(String fileLine);
使用以下格式化程序
public class DateMapper {
public String asString(LocalDate date) {
return date != null ? date.format(DateTimeFormatter.ofPattern("yyyyMMdd")) : null;
}
public LocalDate asDate(String date) {
return date != null ? LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyyMMdd")) : null;
}
}
创造
@Override
PersonBio fileLineToPersonBio(String fileLine) {
if ( fileLine == null ) {
return null;
}
PersonBio personBio = new PersonBio();
personBio.setBirthDate( fileLine.substring(redactedpackagename.Constants.BIRTH_DATE_START_POS, redactedpackagename.Constants.BIRTH_DATE_END_POS) );
return personBio;
}
编辑:我对这个 post 做了一些我认为应该有效的修改,但它仍然无效。
MapStruct 不会在生成时验证表达式。这意味着您必须确保您的表达式输出有效代码。
我会尝试从另一个方面来解决您要解决的问题。与其使用表达式,不如使用自定义映射来从字符串中创建日期。
您可以在文档的 Expressions 部分阅读有关表达式的更多信息。
由于您的 java 表达式的输出是一个字符串,您希望 mapstruct 将调用 DateMapper 的 asDate 方法 class ?
您希望在生成的代码中包含如下内容:
...
personBio.setBirthDate( new DateMapper().asDate(fileLine.substring(redactedpackagename.Constants.BIRTH_DATE_START_POS, redactedpackagename.Constants.BIRTH_DATE_END_POS)));
..
你是对的,它不起作用。不知道为什么...
相反,您可以导入映射器并在 java 表达式中使用它,然后使用 StringUtils 检查输入:
@Mapper(imports = {DateMapper.class, StringUtils.class})
public interface PersonBioMapper {
@Mapping(target = "birthDate",
expression = "java(new DateMapper().asDate(StringUtils.substring(fileLine, redactedpackagename.Constants.BIRTH_DATE_START_POS, redatcedpackagename.Constants.BIRTH_DATE_END_POS)))")
PersonBio fileLineToPersonBio(String fileLine);
}
另一种方式(更具可读性?)就像 Filip 所说的那样,做一个自定义映射:
@Mapper
public interface PersonBioMapper {
default PersonBio fileLineToPersonBio(String fileLine) {
PersonBio personBio = new PersonBio();
personBio.setBirthDate(new DateMapper().asDate(StringUtils.substring(fileLine,redactedpackagename.Constants.BIRTH_DATE_START_POS, redactedpackagename.Constants.BIRTH_DATE_END_POS)));
return personBio;
}
}
我试图让 Mapstruct 理解源表达式是一个可以格式化为 java.util.LocalDate 的字符串,但我不确定我做的是否正确。我尝试按照 mapstruct 文档中的说明进行操作。
@Mapping(componentModel = "cdi", uses=DateMapper.class)
public abstract class RedactedClassName
@Mapping(target = "birthDate",
expression = "java(fileLine.substring(redactedpackagename.Constants.BIRTH_DATE_START_POS, redatcedpackagename.Constants.BIRTH_DATE_END_POS))")
abstract PersonBio fileLineToPersonBio(String fileLine);
使用以下格式化程序
public class DateMapper {
public String asString(LocalDate date) {
return date != null ? date.format(DateTimeFormatter.ofPattern("yyyyMMdd")) : null;
}
public LocalDate asDate(String date) {
return date != null ? LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyyMMdd")) : null;
}
}
创造
@Override
PersonBio fileLineToPersonBio(String fileLine) {
if ( fileLine == null ) {
return null;
}
PersonBio personBio = new PersonBio();
personBio.setBirthDate( fileLine.substring(redactedpackagename.Constants.BIRTH_DATE_START_POS, redactedpackagename.Constants.BIRTH_DATE_END_POS) );
return personBio;
}
编辑:我对这个 post 做了一些我认为应该有效的修改,但它仍然无效。
MapStruct 不会在生成时验证表达式。这意味着您必须确保您的表达式输出有效代码。
我会尝试从另一个方面来解决您要解决的问题。与其使用表达式,不如使用自定义映射来从字符串中创建日期。
您可以在文档的 Expressions 部分阅读有关表达式的更多信息。
由于您的 java 表达式的输出是一个字符串,您希望 mapstruct 将调用 DateMapper 的 asDate 方法 class ?
您希望在生成的代码中包含如下内容:
...
personBio.setBirthDate( new DateMapper().asDate(fileLine.substring(redactedpackagename.Constants.BIRTH_DATE_START_POS, redactedpackagename.Constants.BIRTH_DATE_END_POS)));
..
你是对的,它不起作用。不知道为什么...
相反,您可以导入映射器并在 java 表达式中使用它,然后使用 StringUtils 检查输入:
@Mapper(imports = {DateMapper.class, StringUtils.class})
public interface PersonBioMapper {
@Mapping(target = "birthDate",
expression = "java(new DateMapper().asDate(StringUtils.substring(fileLine, redactedpackagename.Constants.BIRTH_DATE_START_POS, redatcedpackagename.Constants.BIRTH_DATE_END_POS)))")
PersonBio fileLineToPersonBio(String fileLine);
}
另一种方式(更具可读性?)就像 Filip 所说的那样,做一个自定义映射:
@Mapper
public interface PersonBioMapper {
default PersonBio fileLineToPersonBio(String fileLine) {
PersonBio personBio = new PersonBio();
personBio.setBirthDate(new DateMapper().asDate(StringUtils.substring(fileLine,redactedpackagename.Constants.BIRTH_DATE_START_POS, redactedpackagename.Constants.BIRTH_DATE_END_POS)));
return personBio;
}
}