问:maptruct可以理解表达式返回一个String,以便它可以使用我提供的dateFormat吗?

问题描述 投票:0回答:2

我正在尝试让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;
    }

编辑:我已将这篇文章改为我认为应该有效的内容,但它仍然无效。

java mapstruct
2个回答
1
投票

由于java表达式的输出是一个字符串,您希望mapstruct将调用DateMapper类的asDate方法吗?

您希望在生成的代码中具有以下内容:

...
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);
}

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

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

0
投票

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

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

您可以在文档的Expressions部分中阅读有关表达式的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.