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