【问题标题】:Struts2 JSON to Java Action Object (can't find the error)Struts2 JSON to Java Action Object(找不到错误)
【发布时间】:2016-05-14 00:04:00
【问题描述】:

我尝试了多个版本并阅读了几个相关的答案,但我仍然无法弄清楚为什么 Struts 没有填充我的 Action 属性 user

这是我的 ajax 调用

function save_new_user() {

    var user = 
    {       username: $('#new_user_username').val(),
            email: $('#new_user_email').val(),
            password: $('#new_user_password').val()         
    };

    user_json = JSON.stringify(user);
    console.log(user_json);

    var data = {'user': user_json};

    $.ajax({
        type : 'GET',
        url : 'SaveNewUser',
        data: data,
        dataType : "json",
        contentType: 'application/json',
        success : function(data, textStatus, jqXHR) {
            if(data) {

            }
        },
    });
}

顺便说一下,在控制台中打印这个

{"username":"dd","email":"ff","password":"gg"}

我的 Action 类(带注释),(我没有从 struts2-json-plugin-2.3.24.1 修改 json-default 拦截器)是

package coproject.cpweb.actions;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;

import com.opensymphony.xwork2.ActionSupport;

import coproject.cpweb.utils.db.entities.UserDum;
import coproject.cpweb.utils.db.services.DbServicesImp;

@Action("SaveNewUser")
@ParentPackage("json-default")
@Results({
    @Result(name="success", type="json"),
    @Result(name="input", location="/views/error.jsp")
})
public class SaveNewUser extends ActionSupport{

    private static final long serialVersionUID = 1L;

    /* Services  */
    DbServicesImp dbServices;

    public DbServicesImp getDbServices() {
        return dbServices;
    }

    public void setDbServices(DbServicesImp dbServices) {
        this.dbServices = dbServices;
    }

    /* Input Json  */
    private UserDum user = new UserDum();

    public UserDum getUser() {
        return user;
    }

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

    /* Execute */
    public String execute() throws Exception  {

        // dbServices.saveUser(user);

        System.out.println(user.getUsername());

        return "SUCCESS";
    }


}

UserDum 实体是

package coproject.cpweb.utils.db.entities;

public class UserDum {

    private String username;
    private String email;
    private String password;

    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

但是,当请求到达时,struts-json-plugin 的json 拦截器在尝试设置“用户”时遇到异常。

feb 04, 2016 12:20:14 PM com.opensymphony.xwork2.interceptor.ParametersInterceptor error
SEVERE: Developer Notification (set struts.devMode to false to disable this message):
Unexpected Exception caught setting 'user' on 'class coproject.cpweb.actions.SaveNewUser: Error setting expression 'user' with val
ue ['{"username":"dd","email":"ff","password":"gg"}', ]
feb 04, 2016 12:20:14 PM com.opensymphony.xwork2.util.LocalizedTextUtil warn
WARNING: Missing key [invalid.fieldvalue.user] in bundles [[org/apache/struts2/struts-messages, com/opensymphony/xwork2/xwork-mess
ages]]!

关于可能是什么错误的任何线索?

【问题讨论】:

  • 你需要使用JSONInterceptor
  • 谢谢,我认为 json-default 包已经包含它。那我应该扩展 json-default 包吗?您是否有机会提供我应该添加的示例?

标签: java json ajax struts2 struts2-json-plugin


【解决方案1】:

扩展json-default包并没有将json拦截器设置为拦截器的defaultStack,它只是定义了有这样的拦截器。

@Action 注释中使用interceptorRefs 来设置json 拦截器和defaultStack 到动作。

@Action(value="SaveNewUser", 
        interceptorRefs={ @InterceptorRef("json"), 
                          @InterceptorRef("defaultStack") })

@InterceptorRefs 在类级别将拦截器应用于该类中定义的所有操作。

@InterceptorRefs({
    @InterceptorRef("json"),
    @InterceptorRef("defaultStack")
})

【讨论】:

  • 我已将此作为注释添加到操作 ` @Action(value="SaveNewUser", interceptorRefs={@InterceptorRef("json"), @InterceptorRef("defaultStack")}) @ParentPackage ("json-default") @Results({ @Result(name="success", type="json"), @Result(name="input", location="/views/error.jsp") }) `并且知道没有显示错误,但似乎没有执行该操作。请求后服务器端似乎没有发生任何事情......
  • @JoseOspina 在@Action 中尝试使用@InterceptorRefs 和不带interceptorRefs
  • 现在我的 Eclipse 已经发疯了,没有检测到导入...我将删除 .metadata 并重新开始...这有多有趣。我会告诉你进展如何
  • =( , 用@InterceptorRefs@Action 中的interceptorRefs 实现,但结果是一样的。操作未到达,控制台中没有显示错误
  • 好的,终于!它的工作。我在序列化时出错。 Ajax 调用中“data:X”之后的 X 必须是整个对象的字符串。这是 '{"user":{"username":"user","email":"mail","password":"pass"}}' 然后,我没有将拦截器添加到类中,而是创建了,在 struts.xml 中,一个新的包,带有一个新的拦截器堆栈(带有 json 和 defaultStack),并设置为该包的默认拦截器堆栈。
猜你喜欢
  • 2016-03-26
  • 2014-12-17
  • 2011-05-08
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 2015-01-07
相关资源
最近更新 更多