【问题标题】:How to use JSON-RPC in Struts 2如何在 Struts 2 中使用 JSON-RPC
【发布时间】:2014-02-16 17:33:16
【问题描述】:

我正在使用具有相同版本框架的 Struts2-json-plugin-2.3.16。我收到 JSON 的空响应。

JavaScript/jQuery 函数。

var timeout;
var request;

function getUsers()
{
    if(!request)
    {                    
        request = $.ajax({
            datatype:"json",
            type: "GET",
            contentType: "application/json; charset=utf-8",
            url: "testJsonAction.action",
            success: function(response)
            {
                var user= response.user;
                alert(user);
            },
            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" onclick="getUsers();"/>

</s:form>

动作类:

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

    private User user;
    private static final long serialVersionUID = 1L;

    public TestAction() {
    }

    @JSON(name = "user")
    public User getUser() {
        return user;
    }

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

    @Action(value = "testJsonAction",
    results = {
        @Result(type = "json", name = ActionSupport.SUCCESS, params = {"enableSMD", "true", "enableGZIP", "true", "excludeNullProperties", "true"})})
    public String executeAction() throws Exception {
        try {
            user = new User();
            user.setName("Tiny");
            user.setDob(new SimpleDateFormat("dd-MMM-YYYY").parse("29-Feb-2000"));
            user.setLocation("India");
        } catch (ParseException ex) {
            Logger.getLogger(TestAction.class.getName()).log(Level.SEVERE, null, ex);
        }

        return ActionSupport.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 {
        return ActionSupport.SUCCESS;
    }
}

User 类:

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getDob() {
        return dob;
    }

    public void setDob(Date dob) {
        this.dob = dob;
    }

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }
}

TestAction 类中的executeAction() 方法在单击给定按钮时被调用,但我没有将用户对象作为 JSON 响应。它似乎总是空的。

这里缺少什么?除了Struts2-json-plugin-2.3.16 库之外,它还需要其他库吗?


在这种情况下使用直接链接http://localhost:8080/TestStruts/admin_side/testJsonAction.action,我得到以下字符串。

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

【问题讨论】:

  • 你想对请求使用 JSON-RPC 吗?
  • 对不起,我不明白。我第一次看到JSON-RPC
  • enableSMD=true 用于JSON-RPC 请求。它允许将对象传递给操作以执行方法并返回结果,因此可以在客户端和服务器上使用相同的对象,一切看起来都是透明的。
  • 只有当我从参数列表params 中删除"root", "stateTables", "enableSMD", "true", 时,它才起作用。否则,响应为空。我不明白。
  • json 结果的 enableSMD 参数不会将根对象序列化到输出,而是返回一个 JSON-RPC 服务定义,客户端可以使用该服务定义来调用此服务方法。但是您没有在应该返回可以在客户端上获取的对象的方法上使用 @SMDMethod 注释。

标签: java jquery json struts2 json-rpc


【解决方案1】:

如果你需要在 Struts2 中使用 JSON-RPC,你应该怎么做:

配置返回 JSON-RPC 服务的操作

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

创建一个方法

@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;
}

现在,你需要一个 JSON-RPC 客户端来发出请求,或者试试$.ajax

<s:url var="testJsonUrl" action="testJsonAction"/>
<script type="text/javascript">
  $(document).ready(function(){
    $("#btnUser").click(function(){
      $.ajax({
        type:"POST",
        url: "<s:property value='#testJsonUrl'/>",
        dataType:"json",            
        data: JSON.stringify({jsonrpc:'2.0', method:'getUser', id:'jsonrpc'}),  
        contentType: "application/json-rpc; charset=utf-8",
        success: function(response) {
          var user= response.result;  
          alert(JSON.stringify(user));
        }
      });
    });
  });
</script>

【讨论】:

  • 我尝试过完全相同的事情,但响应总是空的。可能是,我会有下一个问题:)。它可以在没有JSON-RPC 的情况下工作。
  • 今天早上我用工作解决方案更新了代码,我没有检查 ParseExceptionUser 初始化相关。
  • 不抛出解析异常。我收到这个字符串作为回复,{"methods":[{"name":"getUser","parameters":[]}],"serviceType":"JSON-RPC","serviceUrl":"\/TestStruts\/admin_side\/testJsonAction.action","version":".1"},地址栏中有一个直接链接。
  • 检查contentType 属性,我已经改变了,serviceUrl 看起来很奇怪,为什么它逃脱了斜线?我没有这样的逃避。请求和服务中的 url 应该相同。
  • 未调用带有@SMDMethod 注释的getUser() 方法。当我将"root", "user" 添加到参数列表-param 时,将调用getUser() 方法,但响应为空。
猜你喜欢
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多