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

TeaVM中Java转JS实现GET请求遇参数类型错误求助

在TeaVM中实现GET请求的解决方案

错误原因

你遇到的错误是因为TeaVM的@JSBody方法不支持直接将自定义Java接口作为参数传递——TeaVM无法自动将普通Java接口转换为JavaScript可识别的对象类型,因此判定第二个参数类型非法。

解决方案

方案1:给回调接口添加@JSObject注解

TeaVM提供了@JSObject注解,用于标记Java接口/类对应JavaScript对象。只需给你的FetchCallback接口添加该注解,TeaVM就能正确识别并处理这个参数:

import org.teavm.jso.JSObject;

@JSObject
public interface FetchCallback {
    void complete(String result);
    void error(String message);
}

原有的fetch方法保持不变即可:

import org.teavm.jso.JSBody;

public class Client {
    @JSBody(params = { "url", "callback" }, script = "fetch(url)\n" +
            ".then(response => response.text())\n" +
            ".then(text => callback.complete(text))\n" +
            ".catch(error => callback.error(error.message));")
    static native void fetch(String url, FetchCallback callback);
}

方案2:使用JSFunction拆分回调

如果不想定义接口,也可以直接用TeaVM的JSFunction类型,将成功和失败回调拆分为两个参数:

import org.teavm.jso.JSBody;
import org.teavm.jso.JSFunction;

public class Client {
    @JSBody(params = { "url", "onSuccess", "onError" }, script = "fetch(url)\n" +
            ".then(response => response.text())\n" +
            ".then(text => onSuccess(text))\n" +
            ".catch(error => onError(error.message));")
    static native void fetch(String url, JSFunction<String> onSuccess, JSFunction<String> onError);
}

调用示例:

Client.fetch("https://your-api-url.com", 
    result -> {
        // 处理成功返回的文本结果
        System.out.println("请求成功:" + result);
    },
    errorMsg -> {
        // 处理错误信息
        System.err.println("请求失败:" + errorMsg);
    }
);

依赖注意事项

确保你的Maven项目中已引入TeaVM的JSO模块依赖(版本请匹配你的TeaVM版本):

<dependency>
    <groupId>org.teavm</groupId>
    <artifactId>teavm-jso</artifactId>
    <version>0.8.1</version> <!-- 替换为你的TeaVM版本 -->
</dependency>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 08:17:30