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

我试图让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;

    }

编辑:我已经将这篇文章修改了一下,我认为应该工作,但它仍然不起作用。


红颜莎娜
浏览 92回答 2
2回答

呼如林

由于 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);}另一种方式(更具可读性?)就像菲利普说的那样,做一个自定义映射:@Mapperpublic 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;  }}

临摹微笑

映射结构不会在生成时验证表达式。这意味着您必须确保表达式输出有效的代码。我会尝试从另一方面解决您试图解决的问题。不要使用表达式,而是使用自定义映射,该映射将从字符串创建日期。您可以在文档的“表达式”部分中阅读有关表达式的详细信息。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java