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
相关产品推荐
相关产品推荐

