簡體   English   中英

Nashorn錯誤:java.lang.NoSuchMethodException:沒有這樣的函數renderServer

[英]Nashorn Error: java.lang.NoSuchMethodException: No such function renderServer

我對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函數,但是mapStateToProps那里沒有mapStateToProps ,所以它無法進行評估,並且根據redux 教程,應該渲染為使用所有props, ProviderReact component的整個字符串,而不僅僅是React component ,否則使用this.store.dispatch函數處理函數this.store.dispatch將不起作用。 我在這里做錯什么以及如何使它起作用?


更新:我發現問題出在成批處理的批處理文件上。 如果將文件放到文件中,我只想評估React組件(JS,而不是JSX)和不帶任何庫的renderServer函數,Nashorn可以找到renderServer函數並調用它。 但是所有教程都說Nashorn非常適合理解批處理文件。 所以我真的不明白這可能是什么問題。

由於您可能正在使用webpack,因此var renderServer最終將成為webpack函數中的局部變量。 global.renderServer = ....應該可以工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM