Aaronlong31

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            12 Posts :: 3 Stories :: 17 Comments :: 0 Trackbacks
          錯(cuò)誤信息:出現(xiàn)java.lang.NoSuchMethodException setUser([LJava.lang.String;)異常

          struts2中的UserAction:
           1 public class UserAction{
           2 private User user;
           3 private String name;
           4 public void setName(String name){
           5 this.name = name;
           6 }
           7 public String getName(){
           8 return name;
           9 }
          10 public User getUser() {
          11       return user;
          12 }
          13 
          14 
          15 public void setUser(User user) {
          16       this.user = user;
          17 }
          18 
          19 public String execute(){
          20      System.println(user.getUsername);
          21 }
          22 
          23 }
          24 
          User就兩個(gè)屬性:username/password.
          這個(gè)是開始的struts.xml中的代碼:
          <package name="json" extends="json-default">  
               
          <action name="save" class="com.aaron.example.action.UserAction">  
              
          <result type="json"></result>  
               
          </action>  
          </package>  
          這個(gè)是jQuery代碼:
          $(function(){   
               
          var json = {"user":{"username":"zhangsan","password":"123"}};//方法1   
               //json = {"name":"zhanglong"};// 方法2    
               //json = {"user.username":"zhangsan","user.password":123};//方法3   
          }
          ); 
           用方法1會(huì)出項(xiàng)上述錯(cuò)誤,方法2和方法3都可行。

          原因:
          方法2成功的原因是{"name":"zhanglong"}傳遞的是一個(gè)名值對(duì),就像是request的parameter.
          方法3成功也是一樣的,struts2的OGNL會(huì)識(shí)別user.username,并把它對(duì)應(yīng)的值"zhangsan"存放到user的username屬性上
          方法1失敗是因?yàn)閭鞯拿祵?duì)是:"user":"{'username':'zhangsan','password','123'}",這樣struts就會(huì)你要將"{'username':'zhangsan','password','123'}"這個(gè)字符串賦值給user對(duì)象,它就會(huì)調(diào)用setUser(String user)方法(或者是setUser(String[] user)),由于UserAction中沒有這個(gè)方法,所以會(huì)報(bào)錯(cuò)。

          解決方法:
          根據(jù)jsonplugin官方的文檔,頁(yè)面?zhèn)魅氲恼?qǐng)求的content-type要是application/json,否則json的interceptor不會(huì)幫你將json轉(zhuǎn)換為java對(duì)象,這里他忘了說明一點(diǎn),jsonplugin中只是定義了json的interceptor,并沒有將其放入到package的攔截器棧中,還需要我們自己放入自己的package中。如下:
          1 <interceptors>
          2     <interceptor-stack name="myDefaultStack">
          3         <interceptor-ref name="json"/>
          4         <interceptor-ref name="defaultStack"/>
          5     </interceptor-stack>
          6 </interceptors>
          7     
          8 <default-interceptor-ref name="myDefaultStack"/>
          還要設(shè)置jquery的ajax請(qǐng)求的content-type和傳遞類型為"POST":
          1 $.ajax({
          2     type:"POST",
          3     data:jsonText,
          4     url:"save.action?number=" + Math.random(),
          5     contentType:"application/json"
          6 });
          其中jsonText如下:
          1 var jsonText = "{'user':{
          2         'username':'zhangsan',
          3         'password':'123'
          4     }
          5 }"
          注意,整個(gè)jsonText是個(gè)字符串,其中的名值對(duì)的名要用''包起來,否則會(huì)報(bào)異常,指出json格式不對(duì)。
          只有這樣做了后,json攔截器才會(huì)幫你做轉(zhuǎn)換。

          還有,如果UserAction中有個(gè)userService的話,需要設(shè)置action的result的param:
          1 <result type="json">
          2     <param name="excludeProperties">
          3              userService
          4     </param>
          5 </result>
          這樣就不會(huì)將userService進(jìn)行序列化了,或者可以將action中的getUserService()方法去掉。

          如果user對(duì)象是從hibernate獲取的,可能得到的是一個(gè)代理對(duì)象,對(duì)其進(jìn)行json序列化時(shí)會(huì)出錯(cuò)。解決辦法是為User對(duì)象加上@Proxy(lazy=false)注解。
          posted on 2010-06-29 15:10 Aaronlong31 閱讀(12638) 評(píng)論(17)  編輯  收藏

          Feedback

          # re: 關(guān)于用jquery傳遞json給struts2中的復(fù)雜對(duì)象的方法 2010-06-29 23:29 freeman1984
          有這樣做的必要嗎,直接序列化一個(gè)對(duì)象成 對(duì)象.屬性傳過去 struts的ognl不就解決了,復(fù)雜了這樣。。。。  回復(fù)  更多評(píng)論
            

          # re: 關(guān)于用jquery傳遞json給struts2中的復(fù)雜對(duì)象的方法 2010-06-30 10:17 Aaronlong31
          @freeman1984
          我之前也是想這么做的,但有的對(duì)象很復(fù)雜,里面還嵌套了其他對(duì)象,還有List對(duì)象,若是用對(duì)象.屬性的話就會(huì)很復(fù)雜,jsonText看著很龐大。

          這只是我的觀點(diǎn),歡迎討論。



            回復(fù)  更多評(píng)論
            

          # re: 關(guān)于用jquery傳遞json給struts2中的復(fù)雜對(duì)象的方法 2010-07-05 23:21 來如風(fēng)
          一樓的辦法好,其實(shí)不管多復(fù)雜,你都要傳遞的  回復(fù)  更多評(píng)論
            

          # re: 關(guān)于用jquery傳遞json給struts2中的復(fù)雜對(duì)象的方法 2010-07-06 16:46 tipx
          其它只要做一個(gè)嘗試解析json對(duì)象的方法就可以了。
          在$.post前,將{user:{uname:'aa', sex:'f'}}解析成{'user.uname':'aa', 'user.sex':'f'}  回復(fù)  更多評(píng)論
            

          # re: 關(guān)于用jquery傳遞json給struts2中的復(fù)雜對(duì)象的方法[未登錄] 2012-05-16 10:23
          <interceptors>
          2 <interceptor-stack name="myDefaultStack">
          3 <interceptor-ref name="json"/>
          4 <interceptor-ref name="defaultStack"/>
          5 </interceptor-stack>
          6 </interceptors>
          7
          8 <default-interceptor-ref name="myDefaultStack"/>
          這是在哪配置的啊  回復(fù)  更多評(píng)論
            

          # re: 關(guān)于用jquery傳遞json給struts2中的復(fù)雜對(duì)象的方法 2012-05-16 10:26 Aaronlong31
          @林
          在struts2.xml中配置  回復(fù)  更多評(píng)論
            

          # re: 關(guān)于用jquery傳遞json給struts2中的復(fù)雜對(duì)象的方法[未登錄] 2012-05-16 11:02
          @Aaronlong31
          不行 配置了以后 ajax就出錯(cuò)了 有例子嗎?謝謝了  回復(fù)  更多評(píng)論
            

          # re: 關(guān)于用jquery傳遞json給struts2中的復(fù)雜對(duì)象的方法[未登錄] 2012-05-16 11:16
          contentType:"application/json"
          我ajax加上這個(gè)就出錯(cuò)了,不加不出錯(cuò)但是,填充不上值  回復(fù)  更多評(píng)論
            

          # re: 關(guān)于用jquery傳遞json給struts2中的復(fù)雜對(duì)象的方法 2012-05-16 11:17 Aaronlong31
          @林
          之前的例子找不到了。
          加上contentType:"application/json" 這個(gè)出了什么錯(cuò)?  回復(fù)  更多評(píng)論
            

          # re: 關(guān)于用jquery傳遞json給struts2中的復(fù)雜對(duì)象的方法[未登錄] 2012-05-16 11:54
          error : function(msg) {

          alert("error"+msg);
          }
          直接不到后臺(tái),直接alert了  回復(fù)  更多評(píng)論
            

          # re: 關(guān)于用jquery傳遞json給struts2中的復(fù)雜對(duì)象的方法 2012-05-16 11:55 Aaronlong31
          @林
          你可以用firebug或者chrome查看請(qǐng)求和響應(yīng)的內(nèi)容  回復(fù)  更多評(píng)論
            

          # re: 關(guān)于用jquery傳遞json給struts2中的復(fù)雜對(duì)象的方法[未登錄] 2012-05-16 13:21
          @Aaronlong31
          用firebug看不到錯(cuò)誤 后臺(tái)斷點(diǎn)直接就不執(zhí)行 估計(jì)是配置的不對(duì)吧  回復(fù)  更多評(píng)論
            

          # re: 關(guān)于用jquery傳遞json給struts2中的復(fù)雜對(duì)象的方法[未登錄] 2012-05-16 13:27
          求例子  回復(fù)  更多評(píng)論
            

          # re: 關(guān)于用jquery傳遞json給struts2中的復(fù)雜對(duì)象的方法 2012-05-16 13:28 Aaronlong31
          @林
          晚上幫你弄個(gè)吧,你告訴我Q  回復(fù)  更多評(píng)論
            

          # re: 關(guān)于用jquery傳遞json給struts2中的復(fù)雜對(duì)象的方法[未登錄] 2012-05-16 13:38
          1282681868 謝謝了  回復(fù)  更多評(píng)論
            

          # re: 關(guān)于用jquery傳遞json給struts2中的復(fù)雜對(duì)象的方法[未登錄] 2012-05-16 15:47
          終于找到報(bào)錯(cuò)信息了
          org.apache.struts2.json.JSONException: Input string is not well formed JSON (invalid char g)
          org.apache.struts2.json.JSONReader.buildInvalidInputException(JSONReader.java:155)
          org.apache.struts2.json.JSONReader.read(JSONReader.java:119)
          org.apache.struts2.json.JSONReader.read(JSONReader.java:74)
          org.apache.struts2.json.JSONUtil.deserialize(JSONUtil.java:162)
          org.apache.struts2.json.JSONUtil.deserialize(JSONUtil.java:188)
          org.apache.struts2.json.JSONInterceptor.intercept(JSONInterceptor.java:101)
          com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
          org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
          org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:510)
          org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
          org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
          org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
          org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)  回復(fù)  更多評(píng)論
            

          # re: 關(guān)于用jquery傳遞json給struts2中的復(fù)雜對(duì)象的方法 2015-11-19 16:27 帥比
          我果然還是太菜,為何現(xiàn)在才看到  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 玉林市| 佛学| 郴州市| 来宾市| 鹿泉市| 荃湾区| 且末县| 巩义市| 新河县| 宁波市| 准格尔旗| 盖州市| 安乡县| 青浦区| 河南省| 茂名市| 万全县| 铅山县| 廉江市| 阜宁县| 长春市| 巨鹿县| 长武县| 富蕴县| 德格县| 新田县| 连南| 孝感市| 仪征市| 马关县| 阜阳市| 贵德县| 醴陵市| 肇州县| 德令哈市| 根河市| 乾安县| 阿拉善左旗| 博兴县| 新河县| 静乐县|