【发布时间】:2012-12-27 19:42:14
【问题描述】:
我正在使用 Spring 框架版本 3.0.2 和 Hibernate (NetBeans 6.9.1) 处理 Web 应用程序。后来我才知道,正如我之前的questions 中提到的那样,有一个错误导致上传多个文件时出现问题。
我已经完成了获得解决方案的努力,但未能成功。因此,我将Spring版本升级为3.2.0。
在早期版本 (3.0.2) 中,AJAX 与 Jackson 1.9.8(其下载 page)可以正常工作,但在更高版本 (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 类之一中定义如下,
@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 循环只是为了演示,它显示了与 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 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 并非如此。
编辑:
我尝试在 3.0.2 和 3.2.0 两个框架中解析 List<Object[]>,例如
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<Object[]> 类型的List。因此,问题可能是由 Spring 框架本身引起的。还需要什么,我不确定。为什么杰克逊没有映射它?
【问题讨论】:
-
一位聪明的老程序员教我,“阅读错误,修复错误”。始终在您的问题中包含实际的错误消息,这会使一切变得更容易。
-
在 jQuery 的错误部分中由alerbox 发出和警告的错误是
Error: [object Object]。我看不到其他任何东西。 -
在 chrome 或 firebug 中,您应该能够在执行警报的
error:部分设置断点,然后您可以查看ejavascript 变量。 -
谷歌浏览器显示此错误 -
Failed to load resource: the server responded with a status of 406 (Not Acceptable)。 -
可以肯定的是,我在
dispatcher-servlet.xml文件中有<mvc:annotation-driven />。
标签: ajax json spring jquery spring-json