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

ZUL页面使用widgetModel传flexible search数据报LazyList未定义错误

问题根因

Hybris FlexibleSearch 的search()方法返回的SearchResult.getResult()是懒加载实现类LazyLoadModelList,不是标准的ArrayList。你直接将该对象传入WidgetModel,前端模板渲染为JS变量时,会输出该对象的序列化内容,其中包含LazyList类标识,JS执行时会将其识别为未定义的变量,因此抛出该错误。
另外你直接将后端OrderModel对象传递到前端还存在序列化失败、敏感字段泄露、懒加载属性触发额外查询等隐患。


解决方案

方案1:快速修复(仅临时测试使用)

在DAO层将懒加载列表转换为普通ArrayList后再返回即可,同时修正空返回的问题:

public class OrdersDataDao {
    @Resource
    private FlexibleSearchService flexibleSearchService;

    public List<OrderModel> getAllOrders() {
        final String stringQuery = "select {o.pk} from {order as o}";
        final FlexibleSearchQuery query = new FlexibleSearchQuery(stringQuery);
        final SearchResult<OrderModel> result = flexibleSearchService.search(query);
        // 转成普通ArrayList,空结果返回空列表避免空指针
        return result.getResult() == null ? Collections.emptyList() : new ArrayList<>(result.getResult());
    }
}

方案2:正式项目规范方案

先将OrderModel转换为仅包含前端所需字段的DTO对象,再序列化为JSON字符串传递到前端:

  1. 定义订单DTO类,仅保留前端需要的字段(比如订单号、金额、下单时间等)
  2. 控制器中将查询结果转为DTO列表,再序列化为JSON存入WidgetModel:
@Override
public void preInitialize(Component comp) {
    super.preInitialize(comp);
    WidgetModel model = getWidgetInstanceManager().getModel();
    List<OrderModel> orderList = customGraphService.getAllOrders();
    // 把OrderModel转成自定义的OrderDTO列表
    List<OrderDTO> orderDTOList = orderList.stream().map(order -> {
        OrderDTO dto = new OrderDTO();
        dto.setCode(order.getCode());
        dto.setTotalPrice(order.getTotalPrice());
        dto.setPlaceTime(order.getCreationtime());
        // 其他需要的字段赋值
        return dto;
    }).collect(Collectors.toList());
    // 序列化为JSON字符串
    ObjectMapper objectMapper = new ObjectMapper();
    String ordersJson = objectMapper.writeValueAsString(orderDTOList);
    model.put("ordersJson", ordersJson);
}
  1. 前端ZUL代码修改,正确解析JSON:
window.onload = function () {
    const myChart = new Chart(
            document.getElementById('myChart'),
            config
    );
    // 注意用[(${})]输出未转义的原始字符串,再转成JS对象
    const test = JSON.parse([(${widgetModel.ordersJson})]);
    console.log(test);
};

内容的提问来源于stack exchange,提问作者codesenpai_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:24:06