我正在使用使用Spring框架版本3.0.2和Hibernate(NetBeans 6.9.1)的Web应用程序。后来我知道就像我之前的一个问题中提到的,有一个bug导致上载多个文件时出现问题。
我已经竭尽全力地寻求解决方案,但未能成功。因此,我将Spring版本升级到3.2.0。
在早期版本(3.0.2)中,AJAX在Jackson 1.9.8(其下载页面)上运行良好,但在更高版本(3.2.0)下,一切正常,但是AJAX调用在JavaScript代码中各处均发出错误提示。
在一个国家/地区选择框中选择一个国家/地区时,在某个位置存在一种情况,相应的状态列表与DAO一起从Spring控制器中检索。在Spring控制器中通过URL映射的方法如下:
@RequestMapping(value="ajax/GetStateList", method=RequestMethod.GET) public @ResponseBody List<Object[]> getStateSelectBox(HttpServletRequest request) { return cityService.getStateSelectBox(request.getParameter("countryId")); }
在国家选择框中选择国家时,将调用此方法。该getStateSelectBox()方法在DAO类之一中定义如下,
getStateSelectBox()
@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<Object[]> getStateSelectBox(String id) { List<Object[]> 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循环只是为了演示,它显示了所有状态以及与countryIdAJAX请求提供的状态相对应的ID,但List不会返回给JSP。
foreach
countryId
List
用于发送此AJAX请求的JavaScript代码会提示错误。似乎JSON映射存在一些问题。使用Spring框架的早期版本(3.0.2)也是一样。我不确定为什么这会导致较高版本的Spring 3.2.0出现问题。我可能会缺少春季版本3.2.0的任何内容?
如果需要查看JavaScript代码,则实现此目的的完整JavaScript代码如下。
function getStates(countryId) { if(countryId==""||countryId==null||countryId==undefined||isNaN(countryId)) { var str="<select id='cmbStates' name='cmbStates' onchange='errorMessage(this.value);' class='validate[required] text-input'><option value=''>Select</option></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 id='cmbState' name='cmbState' onchange='errorMessage(this.value);' class='validate[required] text-input'><option value=''>Select</option>"; var l=response.length; for(var i=0;i<l;i++) { str+="<option value='"+response[i][0]+"'>"+$('#temp').text(response[i][1]).html()+"</option>"; } str+="</select>"; $('#stateList').html(str); // select box is written to #stateList div $('#temp').remove(); } }, error: function(e) { alert('Error: ' + e); } }); }
可以肯定的是,杰克逊(Jackson)库位于类路径中,并且在服务器端没有任何错误或异常。AJAX请求成功,它通过Spring到达DAO,并且List<Object[]>从数据库中检索类型列表,但这不是JSON对JSP的响应(可以/应该映射到JavaScript数组)。据推测,JSON映射似乎缺少一些东西,但是早期版本的Spring并非如此。
List<Object[]>
编辑:
我尝试List<Object[]>在3.0.2和3.2.0这两个框架中进行解析,例如
List<Object[]> 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包含以下字符串。
temp.json
[[21,"Gujarat"],[22,"Maharashtra"],[23,"Kerala"],[24,"New Delhi"]]
在两种情况下(使用两个框架)。因此,在两种情况下,JSON响应似乎都应该相同。
该temp.json文件还可以如下反序列化。
try { ObjectMapper mapper=new ObjectMapper(); List<Object[]> list = mapper.readValue(new File("E:/Project/SpringHibernet/wagafashionLatest/temp.json"), new TypeReference<List<Object[]>>() {}); for(Object[]o:list) { System.out.println(o[0]+" : "+o[1]); } } catch (IOException ex) { }
它工作正常,foreach循环遍历Listtype List<Object[]>。因此,问题可能是由Spring框架本身引起的。我还不确定还需要什么。为什么杰克逊没有映射它?
我正在使用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]
response.objectArray[0]
response[0]
无论如何,JSON响应很可能已经改变了格式。您应该查看新的响应,并查看需要在JavaScript中进行哪些更改才能使其映射新的结构。