Spring JSON causa problemas quando o framework Spring é atualizado de 3.0.2 para 3.2.0

Eu estava trabalhando com um aplicativo da web usando o Spring framework versão 3.0.2 junto com o Hibernate (NetBeans 6.9.1). Mais tarde eu vim a saber que havia um dos bugs que estava causando problemas no upload de vários arquivos, como mencionado no meu anteriorquestões.

Eu terminei de lutar para adquirir a solução, mas não consegui. Portanto, atualizei a versão do Spring para3.2.0.

Com a versão anterior (3.0.2), o AJAX estava funcionando bemJackson 1.9.8 (seu downloadpágina) mas com a versão posterior (3.2.0), tudo funciona bem, mas as chamadas AJAX alertam um erro em todo lugar no código JavaScript.

Há um cenário em um local quando um dos países é selecionado na caixa de seleção de país, a lista de estados correspondente é recuperada do controlador Spring junto com o DAO. O método que é mapeado com uma URL no controlador Spring é o seguinte,

@RequestMapping(value="ajax/GetStateList", method=RequestMethod.GET)
public @ResponseBody List<Object[]> getStateSelectBox(HttpServletRequest request)
{
    return cityService.getStateSelectBox(request.getParameter("countryId"));
}   

Este método é invocado quando um país é selecionado na caixa de seleção de país. ogetStateSelectBox() método é definido em uma das classes DAO da seguinte maneira,

@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;
   }
}

oforeach loop é apenas por uma questão de demonstração, ele exibe todos os estados, juntamente com o seu id que correspondem aocountryId fornecido pelo pedido AJAX, mas oList não é retornado ao JSP.

O código JavaScript usado para enviar este pedido AJAX alerta um erro. Parece que há alguns problemas com o mapeamento JSON. A mesma coisa estava trabalhando com a versão anterior do framework Spring (3.0.2). Não tenho certeza por que isso causa problemas com a versão superior do Spring, que é 3.2.0. Existe alguma coisa com a versão Spring 3.2.0 que eu possa estar faltando?

Se você precisasse ver o código JavaScript, o código JavaScript completo para isso seria o seguinte.

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);
        }
    });
}            

Para ter certeza, a biblioteca Jackson está no classpath e não estou recebendo nenhum erro ou exceção no lado do servidor. A solicitação AJAX é bem-sucedida e vai para o DAO via Spring e a lista de tiposList<Object[]> é recuperado do banco de dados, mas não é uma resposta de JSON para JSP (que pode / deve ser mapeado para uma matriz JavaScript). presumivelmente, parece que há algo faltando no mapeamento JSON, que não era o caso da versão anterior do Spring.

EDITAR:

Eu tentei analisarList<Object[]> em ambos os frameworks, 3.0.2 e 3.2.0, como

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){}

O arquivotemp.json contém a seguinte string.

[[21,"Gujarat"],[22,"Maharashtra"],[23,"Kerala"],[24,"New Delhi"]]

Em ambos os casos (com ambas as estruturas). Assim, parece que a resposta JSON deve ser a mesma em ambos os casos.

otemp.json O arquivo também pode ser desserializado da seguinte maneira.

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) 
{

}

Funciona bem e oforeach loop itera sobre oList do tipoList<Object[]>. Então, o problema pode ser causado pelo próprio framework Spring. O que mais é necessário, não tenho certeza. Por que não é mapeado por Jackson?

questionAnswers(2)

yourAnswerToTheQuestion