Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 问:mapstruct能理解表达式返回字符串以便使用我提供的dateFormat吗?_Java_Mapstruct - Fatal编程技术网

Java 问:mapstruct能理解表达式返回字符串以便使用我提供的dateFormat吗?

Java 问:mapstruct能理解表达式返回字符串以便使用我提供的dateFormat吗?,java,mapstruct,Java,Mapstruct,我试图让Mapstruct理解源表达式是一个可以格式化为java.util.LocalDate的字符串,但我不确定我是否做对了。我尝试按照mapstruct文档中的说明进行操作 @Mapping(componentModel=“cdi”,uses=DateMapper.class) 公共抽象类RedactedClassName @映射(target=“birthDate”, expression=“java(fileLine.substring(redactedpackagename.Const

我试图让Mapstruct理解源表达式是一个可以格式化为java.util.LocalDate的字符串,但我不确定我是否做对了。我尝试按照mapstruct文档中的说明进行操作

@Mapping(componentModel=“cdi”,uses=DateMapper.class)
公共抽象类RedactedClassName
@映射(target=“birthDate”,
expression=“java(fileLine.substring(redactedpackagename.Constants.BIRTH\u DATE\u START\u POS,redatcedpackagename.Constants.BIRTH\u END\u POS)))
抽象PersonBio文件行topersonbio(字符串文件行);
使用以下格式化程序

公共类日期映射器{
公共字符串关联(LocalDate){
返回日期!=null?date.format(模式的DateTimeFormatter.of(“yyyyMMdd”):null;
}
公共LocalDate asDate(字符串日期){
返回日期!=null?LocalDate.parse(模式的date、DateTimeFormatter.of(“yyyyymmdd”):null;
}
}
创造

@覆盖
PersonBio文件行topersonbio(字符串文件行){
if(fileLine==null){
返回null;
}
PersonBio PersonBio=新的PersonBio();
personBio.setBirthDate(文件行.子字符串(redactedpackagename.Constants.BIRTH\u DATE\u START\u POS,redactedpackagename.Constants.BIRTH\u END\u POS));
返回personBio;
}

编辑:我对这篇文章做了一些修改,使之符合我的想法,但仍然不起作用。

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

我会试着从另一个角度来解决你要解决的问题。不要使用表达式,而是为其使用自定义映射,该映射将根据字符串创建日期


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

由于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);
}
另一种方法(更具可读性?)如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;
  }
}

表达式的类型不是
LocalDate
,而是
String
。首先尝试在scratch Java文件中使用它,直到它起作用为止。但是,很抱歉,birthDate是一个localdate,这里没有真正显示。我更新了代码以使用自定义映射器,但似乎仍然无法按照mapstruct的说明页工作: