微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正在使用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代码中的每个地方都发出错误警告.

当在国家选择框中选择其中一个国家/地区时,在一个地方有一个场景,从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循环仅用于演示,它显示所有状态及其对应于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并不是这样.

编辑:

我试图解析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类型List< Object []>.因此,问题可能是由Spring框架本身引起的.还需要什么,我不确定.为什么杰克逊没有映射?

解决方法:

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

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

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐