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

Eclipse Scout 22默认抽象图表报错及适配问题咨询

Eclipse Scout 22 默认抽象图表加载报错解决方案:No factory found for model null/ChartField

一、核心问题定位

报错本质是前后端未正确建立图表组件的适配器映射,且前端未完成图表模块的注册,导致Scout无法识别ChartField模型。


二、分步修复方案

1. 完善JSON适配器实现

你已经创建了JsonObjectFactory,但缺少对应的JsonChartField适配器实现,且前端未关联该适配器类型。

(1)实现JsonChartField类

在UI.HTML模块的src/main/java下创建如下类(包路径需确保被Spring组件扫描覆盖):

import org.eclipse.scout.rt.client.ui.basic.chart.IChartField;
import org.eclipse.scout.rt.ui.html.json.AbstractJsonAdapter;
import org.eclipse.scout.rt.ui.html.json.IJsonAdapter;
import org.eclipse.scout.rt.ui.html.json.IUiSession;
import java.util.Map;

public class JsonChartField extends AbstractJsonAdapter<IChartField> {

    public JsonChartField(IChartField model, IUiSession session, String id, IJsonAdapter<?> parent) {
        super(model, session, id, parent);
    }

    @Override
    public String getObjectType() {
        return "ChartField"; // 必须与前端组件类型标识一致
    }

    @Override
    protected void initJsonProperties(Map<String, JsonProperty<IChartField>> propertyMap) {
        super.initJsonProperties(propertyMap);
        // 映射图表数据到前端
        propertyMap.put("chart", new JsonProperty<IChartField>("chart") {
            @Override
            public Object modelValue(IChartField model) {
                return model.getChart().toJson();
            }
        });
    }
}

(2)确保JsonObjectFactory正确返回适配器

你的工厂代码已能打印日志,只需确认返回的是上述JsonChartField实例:

import org.eclipse.scout.rt.client.ui.basic.chart.IChartField;
import org.eclipse.scout.rt.ui.html.json.AbstractJsonObjectFactory;
import org.eclipse.scout.rt.ui.html.json.IJsonAdapter;
import org.eclipse.scout.rt.ui.html.json.IUiSession;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
@Order(100)
public class JsonObjectFactory extends AbstractJsonObjectFactory {

    @Override
    public IJsonAdapter<?> createJsonAdapter(Object model, IUiSession session, String id, IJsonAdapter<?> parent) {
        if (model instanceof IChartField) {
            return new JsonChartField((IChartField) model, session, id, parent);
        }
        return null;
    }
}

2. 修复前端模块注册逻辑

你之前的前端导入方式错误,需将图表模块注册到Scout全局组件工厂:
修改UI.HTML模块的MYPROJECT.js:

import * as chart from '@eclipse-scout/chart';
// 注册图表组件到Scout框架
Scout.addObjectFactories(chart.objectFactories);
Scout.addFieldTypes(chart.fieldTypes);

3. 统一前后端版本

确保后端Maven依赖与前端npm包版本完全一致,修改client pom.xml:

<dependency>
  <groupId>org.eclipse.scout.rt</groupId>
  <artifactId>org.eclipse.scout.rt.chart.client</artifactId>
  <version>22.0.0-beta.10</version> <!-- 与前端@eclipse-scout/chart版本一致 -->
</dependency>

4. 测试数据添加位置

教程中的饼图测试数据,需添加到Chart内部类的execLoadData方法中:

public class ChartField extends AbstractChartField<Chart> {
   public class Chart extends AbstractChart {
     @Override
     protected void execLoadData() {
       // 饼图测试数据
       IChartData data = new PieChartData();
       data.addValue("Chrome", 61.41);
       data.addValue("Internet Explorer", 11.84);
       data.addValue("Firefox", 10.85);
       data.addValue("Edge", 4.67);
       data.addValue("Safari", 4.18);
       data.addValue("Sogou Explorer", 1.64);
       data.addValue("Opera", 1.6);
       data.addValue("QQ", 1.2);
       data.addValue("Other", 2.61);
       setChartData(data);
     }
   }
}

三、最终验证步骤

  1. 执行Maven命令:clean install(清理并重建后端)
  2. 进入UI.HTML模块目录,执行:npm install(更新前端依赖)
  3. 重启应用,打开包含图表的表单

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:05:16