当前位置: 首页 > 面试题库 >

将Spring框架从3.0.2升级到3.2.0时,Spring JSON会引起问题

景胜涝
2023-03-14
问题内容

我正在使用使用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类之一中定义如下,

@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。

用于发送此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[]>在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循环遍历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]

无论如何,JSON响应很可能已经改变了格式。您应该查看新的响应,并查看需要在JavaScript中进行哪些更改才能使其映射新的结构。



 类似资料:
  • 在我当前的项目中,我们使用的是Spring 3.0.5(core、aop、beans、web、webmvc等)。然而,我们希望使用“Spring Security SAML Extension 1.0.0 RC3”来构建一个服务提供商,该服务提供商已经过Spring 3.1.2、Spring Security 3.1.2和OpenSAML 2.5.3的全面测试。 从Spring 3.0.5升级到S

  • 在我当前的项目中,我们使用的是Spring 4.2(core、aop、beans、web、webmvc等)。 从Spring 4.2升级到Spring 5.0.5时,我们可能会遇到哪些主要问题?Spring Security 4.2与Spring 5.0.5的向后兼容性如何? 谢谢你的时间。

  • 在项目设置中将项目SDK更改为1.7 在项目设置中将所有模块SDK更改为1.7 将Maven runner JRE更改为1.7 将windows环境变量中的JAVA_HOME更改为JDK 1.7位置 将BEA_JAVA_HOME和SUN_JAVA_HOME更改为我的域中setdomainenv.sh中的JDK 1.7位置 将commenv.sh文件中的JAVA_HOME更改为1.7 但当我运行pr

  • 我的项目使用Spring Security 3.2.0.RC2,我的JSP使用Spring TagLib的form:form标记自动将CSRF令牌插入到我的表单中。 升级到Spring Security 3.2.0.版本后,我发现form:form标记不再自动将CSRF令牌插入到我的表单中,我现在必须通过将该令牌放在我的表单中来手动添加它: 还有其他人遇到过同样的问题吗?如果是,你做了什么工作?谢

  • 我将spring boot rest服务迁移到使用spring boot 2.0.2,并面临执行器endpoint的问题。我知道SpringBoot删除了Spring2.0.2中执行器框架的自动配置安全性。因此,我认为我必须指定安全性才能访问这些endpoint,但我已经为我的web服务配置了安全性以使用JWT。请建议我如何在spring boot 2.0.2中启用执行器endpoint,并在不影

  • 在升级到用于ES 2.2的spring data elastic search 2.2.0和spring boot 1.3.3之后,我遇到了以下问题 但在他们的github文档中,他们表示支持弹性搜索2.0https://github.com/spring-projects/spring-data-elasticsearch 请让我知道spring data elastic search是否支持E