在Struts2中使用JSON-RPC

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

  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: "", 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); } }); }); 

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

    

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

 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. } 

当单击给定按钮但未单击给定按钮时,应调用使用@SMDMethod注释的getUser()方法(在操作类TestAction )。

此行alert(JSON.stringify(user)); 在jQuery函数的success处理程序中始终警告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和相同版本的框架。

在使用JSON-RPC时是否必须只有POST请求?

是的,它只适用于POST请求

另外includeProperties没有效果

如果它是json拦截器的参数,则includeProperties有效。 不要混淆用于json结果的参数名称。

在这种情况下,字段dob应该被排除在外

在这种情况下,最好使用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; }