我正在使用 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<Object[]> 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<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
循环只是为了演示,它显示了所有状态及其 id,这些状态对应于countryId
AJAX 请求提供的但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 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[]>
在 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
包含以下字符串。
[[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
循环遍历List
of type List<Object[]>
。因此,问题可能是由 Spring 框架本身引起的。还需要什么,我不确定。为什么杰克逊没有映射它?