亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

問:映射結構能否理解表達式返回字符串,以便它可以使用我提供的日期格式?

問:映射結構能否理解表達式返回字符串,以便它可以使用我提供的日期格式?

紅顏莎娜 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 關注
  • 108 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號