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

