jquery - 在 Struts2 中使用 JSON-RPC

标签 jquery json struts2 json-rpc struts2-json-plugin

我使用以下 JavaScript/jQuery 函数进行远程过程调用。

<script src="../js/jquery-1.8.0.min.js" type="text/javascript"></script>
<s:url var="testJsonUrl" action="testJsonAction"/>

var timeout;
var request;

$(document).ready(function(){
    $("#btnUser").click(function(){
        if(!request)
        {
            request = $.ajax({
                datatype:"json",
                type: "GET",
                data: JSON.stringify({jsonrpc:'2.0', method:'getUser', id:'jsonrpc'}),
                contentType: "application/json-rpc; charset=utf-8",
                url: "<s:property value='#testJsonUrl'/>",
                success: function(response)
                {
                    var user = response.result;
                    alert(JSON.stringify(user));  //Always alerts "undefined".
                },
                complete: function()
                {
                    timeout = request = null;
                },
                error: function(request, status, error)
                {
                    if(status!=="timeout"&&status!=="abort")
                    {
                        alert(status+" : "+error);
                    }
                }
            });
            timeout = setTimeout(function() {
                if(request)
                {
                    request.abort();
                    alert("The request has been timed out.");
                }
            }, 30000);
        }
    });
});

当单击按钮时,将调用上述函数,如下所示。

<s:form namespace="/admin_side" action="Test" validate="true" id="dataForm" name="dataForm">
    <input type="button" name="btnUser" id="btnUser" value="Click"/>
</s:form>

要调用该方法的操作类如下。

import com.opensymphony.xwork2.ActionSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.ResultPath;
import org.apache.struts2.json.annotations.SMDMethod;
import util.User;

@Namespace("/admin_side")
@ResultPath("/WEB-INF/content")
@ParentPackage(value = "json-default")
public final class TestAction extends ActionSupport
{
    private User user;

    public TestAction() {}

    @SMDMethod
    public User getUser()
    {
        user = new User();
        user.setName("Tiny");
        user.setLocation("India");

        try {
            user.setDob(new SimpleDateFormat("dd-MMM-YYYY").parse("29-Feb-2000"));
        } catch (ParseException ex) {
            Logger.getLogger(TestAction.class.getName()).log(Level.SEVERE, null, ex);
        }
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Action(value = "testJsonAction",
    results = {
        @Result(type = "json", params = {"enableSMD", "true", "excludeNullProperties", "true"})},
    interceptorRefs = {
        @InterceptorRef(value = "json", params = {"enableSMD", "true"})})
    public String executeAction() throws Exception {
        return SUCCESS;
    }

    @Action(value = "Test",
    results = {
        @Result(name = ActionSupport.SUCCESS, location = "Test.jsp"),
        @Result(name = ActionSupport.INPUT, location = "Test.jsp")},
    interceptorRefs = {
        @InterceptorRef(value = "defaultStack", params = {"params.acceptParamNames", "", "params.excludeMethods", "load", "validation.validateAnnotatedMethodOnly", "true"})})
    public String load() throws Exception {
        //This method is just needed to return a view on page load.
        return ActionSupport.SUCCESS;
    }
}

User类:

public class User
{
    private String name;
    private Date dob;
    private String location;

    //Setters & getters.
}

getUser()方法(在操作类 TestAction 中)用 @SMDMethod 注释预期会在单击给定按钮时被调用,但实际上却没有。

这一行alert(JSON.stringify(user));success jQuery 函数的处理程序始终发出警报 undefined .

使用地址栏中的直接链接,例如,

http://localhost:8080/TestStruts/admin_side/testJsonAction.action

返回以下字符串。

{
    "methods": [{
        "name": "getUser",
        "parameters": []
    }],

    "serviceType": "JSON-RPC",
    "serviceUrl": "\/TestStruts\/admin_side\/testJsonAction.action",
    "version": ".1"
}

这里缺少什么?为什么不JSON-RPC工作?

PS:我正在使用Struts2-json-plugin-2.3.16使用相同版本的框架。

最佳答案

Is it mandatory to have only the POST request while using JSON-RPC?

是的,它仅适用于 POST 请求

Also includeProperties has no effect

如果

includePropertiesjson 拦截器的参数,则它有效。不要将使用的参数名称与 json 结果混淆。

the field dob in this case, should have been excluded

在这种情况下,最好使用 excludeProperties 参数来拦截器,如下所示

@Action(value = "testJsonAction",
results = {
    @Result(type = "json", params = {"enableSMD", "true"})},
interceptorRefs = {
    @InterceptorRef(value = "json", params = {"enableSMD", "true", "excludeProperties", "result\\.dob"})})
public String executeAction() throws Exception {
    return SUCCESS;
}

关于jquery - 在 Struts2 中使用 JSON-RPC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21368194/

相关文章:

javascript - 固定页眉/页脚将垂直滚动条保持在顶部?

javascript - 添加将功能添加到现有自定义航点功能中的功能

java - 使用 Jackson 是否可以忽略所有循环关系而无需添加注释?

javascript - JavaScript 和 HTML5 中的图像放大

javascript - JQuery Sync Selected Radio Button between 2 radio button groups

java - 将 JSONObject 转换为字符串并 long 返回 null

javascript - 在 javascript 对象内创建对象列表

java - Struts2 通配符映射 - 更具体的一个由通用的一个处理

java - 在 Hibernate 3.6.10.Final + c3p0 + struts2 中打开新连接时关闭连接

java - 如何在 netbeans 中制作属性文件