【问题标题】:JSON object is not setting variable in Struts2 ActionJSON 对象未在 Struts2 Action 中设置变量
【发布时间】:2014-07-22 04:45:04
【问题描述】:

我真的在为复杂的 json 对象苦苦挣扎,如下所示:

var data= {service:{
                    client:{idClient: idClient},
                    pet:{idPet: idPet},
                    employee:{idEmployee: idEmployee},
                    conclusion: ''+conclusion}};

我通过这个发送它:

$.ajax({
            url: 'registerService.action',
            type:'post',
            data: JSON.stringify(data),
            contentType: 'application/json',
            dataType: 'json',
            succes: function(data){
                //do something
            }
    }); 

并且触发了异常:java.lang.NullPointerException,表示action中的变量service还没有被实例化。

public class SomeAction extends ActionSupport{
private Service service; //getter y setter

public String registerService(){
    Integer cod= (getServiceService().registerService(service));
    return SUCCESS;
}   

Service 类看起来像这样

public class Service {
//everything with its respective setter a getter
private Client client;
private Pet pet;
private Employee employee;
private String conclusion;

public Service(){
  client = new Client();
  pet = new Pet();
  employee= new Employee();
}

}

另外,不同对象的每个id都是整数。

希望能帮到你 提前谢谢


解决方案

对象服务实例化后,它的属性为空,那是因为我没有在struts.xml中包含和映射相应拦截器的动作如下

struts.xml

<interceptors>
<interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>
</interceptors>

动作映射

<action name="registerService" class="servicioActionSpring"  method="registerService">
        <interceptor-ref name="json"/>
        <result type="json"></result>
    </action>

【问题讨论】:

    标签: java jquery ajax json struts2


    【解决方案1】:

    没错,应该初始化属性。

    private Service service = new Service(); //getter y setter
    

    或者您可以使用内部 DI 机制以this 的方式进行操作。如果您使用其他 DI 框架,则应使用相应的插件。

    由于您将 JSON 发送到操作,请确保您在操作配置中使用了 json 拦截器。

    【讨论】:

    • 真的吗?我虽然 Struts 2 通过 setter 方法负责对象实例化
    • setter 用于设置对象属性的值,而不是对象实例化。
    • 那么,为什么如果我有例如:private String someName; 并且我发送一个与之匹配的键/值对,变量被初始化?通过我认为的 setter 方法
    • 因为对象是作为参数传递给方法的。在您的情况下,getter 用于 service 属性。
    • 当然,这行得通,服务现在被实例化了,但是......如果客户、宠物、雇员甚至是结论属性的对象没有初始化,尽管它们有它的 getter 和 setter
    猜你喜欢
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 2018-12-11
    • 2013-07-01
    相关资源
    最近更新 更多