Nashorn错误:java.lang.NoSuchMethodException:没有这样的函数renderServer

问题描述 投票:1回答:1

Nashorn与React-redux有奇怪的行为。首先,我有一个非常简单的javascript,在部署之前是babelified(我把JSX放在这里因为生成的babelified文件很大):

var React = require('react');
var ReactDOM = require('react-dom');
var connect = require('react-redux').connect;
var Link = require('react-router').Link;

function mapStateToProps(state) {
    console.log("mapStateToProps ", state);
    return {options: state.options};
};

var IndexContainer = React.createClass({
    render: function () {
        console.log(this.props.options);
        return (
            <div>
                <Link to="r">Link!</Link>
            </div>
        );
    }
});

var Index = connect(mapStateToProps)(IndexContainer);

var renderServer = function (data) {
    var data = Java.from(data);
    return React.renderToString(
        React.createElement(Index, {data: data})
    );
};

其次,我有Java代码:

@Component
@SuppressWarnings("restriction")
public class ReactRenderer {
    private ThreadLocal<NashornScriptEngine> engineHolder = new ThreadLocal<NashornScriptEngine>() {
        @Override
        protected NashornScriptEngine initialValue() {
            NashornScriptEngine nashornScriptEngine = (NashornScriptEngine) new ScriptEngineManager()
                    .getEngineByName("nashorn");
            try {
                nashornScriptEngine.eval(read("static/nashorn-polyfill.js"));
                nashornScriptEngine.eval(read("/WEB-INF/resources/js/main.js"));
            } catch (ScriptException e) {
                throw new RuntimeException(e);
            }
            return nashornScriptEngine;
        } 
    };

    private Reader read(String path) {
        InputStream in = getClass().getClassLoader().getResourceAsStream(path);
        return new InputStreamReader(in);
    }

    public String render(List<Object> objects) {
        try {
            Object html = engineHolder.get().invokeFunction("renderServer", objects);
            return String.valueOf(html); 
        } catch (Exception e) {
            throw new IllegalStateException("failed to render react component", e);
        }
    }
}

当我在java中调用render(objects)时,我得到:

java.lang.NoSuchMethodException: No such function renderServer
    jdk.nashorn.api.scripting.ScriptObjectMirror.callMember(ScriptObjectMirror.java:204)
    jdk.nashorn.api.scripting.NashornScriptEngine.invokeImpl(NashornScriptEngine.java:383)
    jdk.nashorn.api.scripting.NashornScriptEngine.invokeFunction(NashornScriptEngine.java:190)

如果我删除

function mapStateToProps(state) {
    console.log("mapStateToProps ", state);
    return {options: state.options};
};

它确实找到了renderServer函数,但后来它没有eval,因为没有mapStateToProps那里,并根据redux tutorial应该渲染到所有道具,Provider等整个事情,而不仅仅是React component,否则使用this.store.dispatch处理函数将不会工作。我在这里做错了什么以及如何让它发挥作用?


更新:我发现问题出在babelified批处理文件中。如果我放入文件我只想评估React组件(JS,而不是JSX)和没有任何库的renderServer函数,Nashorn能够找到renderServer函数并调用它。但是所有的教程都说Nashorn非常适合理解批处理文件。所以我真的不明白问题是什么。

javascript java reactjs nashorn redux
1个回答
1
投票

由于您可能正在使用webpack,因此var renderServer最终成为webpack函数中的局部变量。 global.renderServer = ....应该工作

© www.soinside.com 2019 - 2024. All rights reserved.