You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AEM Multifield字段值修改问题:无法更新格式化后的createTime

AEM Multifield字段格式化问题解决方案

问题根源

你遇到的问题是Sling Model代理类的特性导致的:当用@Model注解声明接口时,Sling会自动生成代理实现,这些代理类的setter方法并不会实际修改从Resource注入的属性值——@Inject标记的getCreateTime()是直接绑定到原始资源数据的,代理类的setCreateTime()没有对应的存储逻辑,因此调用后再获取createTime仍会返回原始值。

以下是两种可行的解决方案:


方案一:Java层处理格式化(推荐)

方式1:在ListingModel中新增格式化方法

修改ListingModel接口,直接添加返回格式化时间的默认方法,无需修改原属性值:

@Model(adaptables = Resource.class, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public interface ListingModel {
    @Inject
    String getNotificationLogo();
    
    @Inject
    String getCreateTime();
    
    @Inject
    boolean isActive();

    // 新增默认方法,返回格式化后的时间
    default String getFormattedCreateTime() {
        return changeDateFormat(getCreateTime());
    }

    // 格式化逻辑封装到内部
    private String changeDateFormat(String dateValue) {
        // 你的日期格式化实现
    }
}

在Sightly中直接调用:

<div data-sly-list.item="${model.notificationItems}">
  <p>${item.formattedCreateTime}</p>
</div>

方式2:转换为DTO对象存储格式化后数据

如果不想修改ListingModel,可以创建DTO类封装原始数据和格式化结果:

// 新建DTO类
public class NotificationItemDTO {
    private String notificationLogo;
    private String rawCreateTime;
    private String formattedCreateTime;
    private boolean active;

    public NotificationItemDTO(ListingModel model, Function<String, String> formatter) {
        this.notificationLogo = model.getNotificationLogo();
        this.rawCreateTime = model.getCreateTime();
        this.formattedCreateTime = formatter.apply(model.getCreateTime());
        this.active = model.isActive();
    }

    // getter方法
    public String getNotificationLogo() { return notificationLogo; }
    public String getRawCreateTime() { return rawCreateTime; }
    public String getFormattedCreateTime() { return formattedCreateTime; }
    public boolean isActive() { return active; }
}

修改NotificationAlerts生成DTO列表:

@Model(adaptables = {SlingHttpServletRequest.class, Resource.class}, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public class NotificationAlerts {

    @Inject
    @Via("resource")
    @Default(values = CommonConstants.EMPTY)
    @Named("notificationItems")
    private List<ListingModel> notificationItems;

    private List<NotificationItemDTO> formattedItems;

    public List<NotificationItemDTO> getFormattedItems() {
        return formattedItems;
    }

    @PostConstruct
    private void initModel() {
        formattedItems = new ArrayList<>();
        for (ListingModel model : notificationItems) {
            formattedItems.add(new NotificationItemDTO(model, this::changeDateFormat));
        }
    }

    String changeDateFormat(String dateValue) {
        // 你的日期格式化实现
    }
}

Sightly中遍历DTO列表:

<div data-sly-list.item="${model.formattedItems}">
  <p>${item.formattedCreateTime}</p>
</div>

方案二:在Sightly中直接调用格式化方法

方式1:通过NotificationAlerts暴露公共方法

修改NotificationAlerts,将格式化方法改为public:

public String changeDateFormat(String dateValue) {
    // 你的日期格式化实现
}

Sightly中直接调用该方法:

<sly data-sly-use.notificationModel="com.yourpackage.NotificationAlerts">
  <div data-sly-list.item="${notificationModel.notificationItems}">
    <p>格式化时间:${notificationModel.changeDateFormat(item.createTime)}</p>
  </div>
</sly>

方式2:创建独立的日期格式化Use类

新建专门的格式化工具类:

@Model(adaptables = SlingHttpServletRequest.class)
public class DateFormatter {
    public String format(String dateValue) {
        // 你的日期格式化实现
    }
}

Sightly中引入并使用:

<sly data-sly-use.notificationModel="com.yourpackage.NotificationAlerts"
     data-sly-use.dateFormatter="com.yourpackage.DateFormatter">
  <div data-sly-list.item="${notificationModel.notificationItems}">
    <p>格式化时间:${dateFormatter.format(item.createTime)}</p>
  </div>
</sly>

内容的提问来源于stack exchange,提问作者Thomas A Mathew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 05:47:25