为了账号安全,请及时绑定邮箱和手机立即绑定

问:映射结构能否理解表达式返回字符串,以便它可以使用我提供的日期格式?

问:映射结构能否理解表达式返回字符串,以便它可以使用我提供的日期格式?

红颜莎娜 2022-09-14 17:36:58
我试图让Mapstruct理解源表达式是一个字符串,它可以格式化为java.util.LocalDate,但我不确定我做得对不对。我尝试按照地图结构文档中的说明进行操作。@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;    }编辑:我已经将这篇文章修改了一下,我认为应该工作,但它仍然不起作用。
查看完整描述

2 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

由于 Java 表达式的输出是一个字符串,因此您希望映射结构将调用日期映射器类的 asDate 方法?


您希望在生成的代码中包含的内容如下所示:


...

personBio.setBirthDate( new DateMapper().asDate(fileLine.substring(redactedpackagename.Constants.BIRTH_DATE_START_POS, redactedpackagename.Constants.BIRTH_DATE_END_POS)));

..

你是对的,它不起作用。我不知道为什么。。。


相反,您可以导入映射器并在 Java 表达式中使用它,并使用字符串实用程序检查输入:


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

}

另一种方式(更具可读性?)就像菲利普说的那样,做一个自定义映射:


@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;

  }

}


查看完整回答
反对 回复 2022-09-14
?
临摹微笑

TA贡献1982条经验 获得超2个赞

映射结构不会在生成时验证表达式。这意味着您必须确保表达式输出有效的代码。

我会尝试从另一方面解决您试图解决的问题。不要使用表达式,而是使用自定义映射,该映射将从字符串创建日期。

您可以在文档的“表达式”部分中阅读有关表达式的详细信息。


查看完整回答
反对 回复 2022-09-14
  • 2 回答
  • 0 关注
  • 91 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信