当Spring框架从3.0.2升级到3.2.0时,Spring JSON会导致问题

我正在使用Spring框架版本3.0.2和Hibernate(NetBeans 6.9.1)使用Web应用程序。 后来我才知道有一个错误导致上传多个文件时出现问题,正如我之前的一个问题所提到的那样。

我已经完成了努力获得解决方案,但无法成功。 因此,我将Spring版本升级到3.2.0 。

使用早期版本(3.0.2),AJAX与Jackson 1.9.8 (其下载页面 )一起工作正常,但是在更高版本(3.2.0)中,一切正常,但AJAX调用在JavaScript代码中无处不在。

当在国家选择框中选择其中一个国家/地区时,在一个地方有一个场景,从Spring控制器和DAO一起检索相应的状态列表。 在Spring控制器中使用URL映射的方法如下,

@RequestMapping(value="ajax/GetStateList", method=RequestMethod.GET) public @ResponseBody List getStateSelectBox(HttpServletRequest request) { return cityService.getStateSelectBox(request.getParameter("countryId")); } 

在国家/地区选择框中选择国家/地区时,将调用此方法。 getStateSelectBox()方法在其中一个DAO类中定义,如下所示,

 @Service @Transactional(readOnly = true, propagation=Propagation.REQUIRES_NEW) public final class CityDAO implements CityService { private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } @SuppressWarnings("unchecked") public List getStateSelectBox(String id) { List list = sessionFactory.getCurrentSession() .createQuery("select s.stateId, s.stateName from StateTable s where countryId.countryId=:id order by s.stateId") .setParameter("id", Long.parseLong(id)).list(); for(Object[]o:list) { System.out.println(o[0]+" : "+o[1]); } return list; } } 

foreach循环仅用于演示,它显示所有状态及其对应于AJAX请求提供的countryId的id,但List不返回给JSP。

用于发送此AJAX请求的JavaScript代码会发出错误警报。 似乎JSON映射存在一些问题。 同样的事情是使用早期版本的Spring框架(3.0.2)。 我不确定为什么这会导致更高版本的Spring 3.2.0出现问题。 我可能会缺少Spring版本3.2.0吗?


如果您需要查看JavaScript代码,那么实现此目的的完整JavaScript代码如下所示。

 function getStates(countryId) { if(countryId==""||countryId==null||countryId==undefined||isNaN(countryId)) { var str="Select"; $('#stateList').html(str); alert("Please select an appropriate option."); return; } var div=document.createElement("div"); div.id="temp"; document.body.appendChild(div); $.ajax({ datatype:"json", type: "GET", contentType: "application/json", url: "/wagafashion/ajax/GetStateList.htm", data: "countryId=" + countryId+"&t="+new Date().getTime(), success: function(response) { if(typeof response==='object'&&response instanceof Array) { var str="Select"; var l=response.length; for(var i=0;i<l;i++) { str+=""+$('#temp').text(response[i][1]).html()+""; } str+=""; $('#stateList').html(str); // select box is written to #stateList div $('#temp').remove(); } }, error: function(e) { alert('Error: ' + e); } }); } 

可以肯定的是,Jackson库位于类路径上,我在服务器端没有收到任何错误或exception。 AJAX请求成功,它通过Spring转到DAO,并从数据库中检索List类型的List ,但它不是JSON对JSP的响应(可以/应该映射到JavaScript数组) 。 据推测,似乎JSON映射缺少某些东西,但早期版本的Spring并不是这样。


编辑:

我试图在两个框架3.0.2和3.2.0中解析List

 List list = cityService.getStateSelectBox(request.getParameter("countryId")); ObjectMapper objectMapper=new ObjectMapper(); try { objectMapper.writeValue(new File("E:/Project/SpringHibernet/wagafashionLatest/temp.json"), list); } catch (IOException ex){} 

temp.json文件包含以下字符串。

 [[21,"Gujarat"],[22,"Maharashtra"],[23,"Kerala"],[24,"New Delhi"]] 

在这两种情况下(两个框架)。 因此,在两种情况下,JSON响应似乎都应该相同。

temp.json文件也可以反序列化,如下所示。

 try { ObjectMapper mapper=new ObjectMapper(); List list = mapper.readValue(new File("E:/Project/SpringHibernet/wagafashionLatest/temp.json"), new TypeReference<List>() {}); for(Object[]o:list) { System.out.println(o[0]+" : "+o[1]); } } catch (IOException ex) { } 

它工作正常, foreach循环迭代List类型List 。 因此,问题可能是由Spring框架本身引起的。 还需要什么,我不确定。 为什么jackson没有映射?

我正在使用Spring 3.1.3并且我发现Jackson映射尝试在响应中创建根对象。 这是与Jackson2映射器。 我没有尝试使用较旧的jackson映射器。 如果你也升级了jackson,你可能会看到同样的问题。

在过去,对象数组将被映射为类似的东西

 [{name:'name1',id:4},{name:'name2',id:6}] 

现在我发现它们为对象提供了一个自动生成的对象名称,所以它返回类似的东西

 { objectArray: [{name:'name1',id:4},{name:'name2',id:6}]} 

所以你需要引用response.objectArray[0]而不是能够直接引用response[0]

无论如何,JSON响应很可能在某种程度上改变了格式。 您应该查看新响应并查看需要在javascript中进行哪些更改以使其映射新结构。

我在Spring论坛上有相同的post 。 回答最终对我dispatcher-servlet.xml的问题的解决方案需要配置dispatcher-servlet.xml文件,如下所示。

        atom=application/atom+xml html=text/html json=application/json *=*/*    

这导致JSON与Jackson 1.9.8和Spring 3.2.0一起使用 。 这归功于对该问题的所有答复


我的整个dispatcher-servlet.xml文件现在如下所示。

            atom=application/atom+xml html=text/html json=application/json *=*/*         indexController