Spring JSON powoduje problemy, gdy framework Spring zostanie zaktualizowany z wersji 3.0.2 do 3.2.0

Pracowałem z aplikacją internetową przy użyciu wersji 3.0.2 Spring wraz z Hibernate (NetBeans 6.9.1). Później dowiedziałem się, że był jeden z błędów, który powodował problemy z przesyłaniem wielu plików, jak wspomniano w poprzednimpytania.

Skończyłem walczyć o uzyskanie rozwiązania, ale nie udało się. Dlatego zaktualizowałem wersję Spring do3.2.0.

W poprzedniej wersji (3.0.2) AJAX działał bez zarzutuJackson 1.9.8 (jego pobieraniestrona), ale w późniejszej wersji (3.2.0) wszystko działa dobrze, ale wywołania AJAX ostrzegają o błędzie wszędzie w kodzie JavaScript.

Istnieje scenariusz w jednym miejscu, gdy jeden z krajów jest wybrany w polu wyboru kraju, odpowiednia lista stanów jest pobierana ze sterownika Spring wraz z DAO. Metoda odwzorowana za pomocą adresu URL w kontrolerze Spring wygląda następująco:

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

Ta metoda jest wywoływana, gdy kraj jest wybrany w polu wyboru kraju. ThegetStateSelectBox() Metoda jest zdefiniowana w jednej z klas DAO w następujący sposób:

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

Theforeach pętla jest tylko dla celów demonstracyjnych, wyświetla wszystkie stany wraz z ich identyfikatorem, który odpowiadacountryId dostarczone przez żądanie AJAX, aleList nie jest zwracany do JSP.

Kod JavaScript użyty do wysłania tego żądania AJAX ostrzega o błędzie. Wydaje się, że istnieją pewne problemy z mapowaniem JSON. To samo dotyczyło wcześniejszej wersji Spring Framework (3.0.2). Nie jestem pewien, dlaczego powoduje to problemy z wyższą wersją Springa, która jest 3.2.0. Czy jest coś z wersją Spring 3.2.0, której mogę brakować?

Jeśli potrzebujesz zobaczyć kod JavaScript, pełny kod JavaScript do osiągnięcia tego celu będzie następujący.

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

Aby mieć pewność, biblioteka Jackson znajduje się w ścieżce klasy i nie otrzymuję żadnego błędu ani wyjątku po stronie serwera. Żądanie AJAX powiedzie się i trafi do DAO przez Spring i listę typuList<Object[]> jest pobierany z bazy danych, ale nie jest odpowiedzią JSON na JSP (która mogłaby / powinna być odwzorowana na tablicę JavaScript). przypuszczalnie wydaje się, że czegoś brakuje w mapowaniu JSON, co nie miało jednak miejsca w przypadku wcześniejszej wersji Springa.

EDYTOWAĆ:

Próbowałem parsowaćList<Object[]> w obu frameworkach, 3.0.2 i 3.2.0, takich jak

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

Pliktemp.json zawiera następujący ciąg.

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

W obu przypadkach (z obydwoma ramami). Wydaje się, że odpowiedź JSON powinna być taka sama w obu przypadkach.

Thetemp.json plik można również deserializować w następujący sposób.

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

}

Działa dobrze iforeach pętla iteruje poList typuList<Object[]>. Problem może być spowodowany przez samą strukturę Spring. Co jeszcze jest wymagane, nie jestem pewien. Dlaczego nie jest mapowany przez Jacksona?

questionAnswers(2)

yourAnswerToTheQuestion