Spring JSON verursacht Probleme, wenn das Spring-Framework von 3.0.2 auf 3.2.0 aktualisiert wird

Ich habe mit einer Webanwendung gearbeitet, die das Spring Framework Version 3.0.2 zusammen mit Hibernate (NetBeans 6.9.1) verwendet. Später erfuhr ich, dass es einen Fehler gab, der Probleme beim Hochladen mehrerer Dateien verursachte, wie in meinem vorherigen erwähntFragen.

Ich habe versucht, die Lösung zu finden, konnte aber keinen Erfolg haben. Daher habe ich die Spring-Version auf aktualisiert3.2.0.

Mit der früheren Version (3.0.2) hat AJAX einwandfrei funktioniertJackson 1.9.8 (sein DownloadSeite), aber mit der neueren Version (3.2.0) funktioniert alles einwandfrei, aber AJAX-Aufrufe melden überall im JavaScript-Code einen Fehler.

Es gibt ein Szenario an einer Stelle, an der eines der Länder in der Länderauswahlbox ausgewählt ist. Die entsprechende Statusliste wird zusammen mit DAO vom Spring-Controller abgerufen. Die Methode, die im Spring-Controller mit einer URL verknüpft ist, lautet wie folgt:

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

Diese Methode wird aufgerufen, wenn im Länderauswahlfeld ein Land ausgewählt wird. DasgetStateSelectBox() Methode ist in einer der DAO-Klassen wie folgt definiert:

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

Dasforeach loop dient nur der Veranschaulichung und zeigt alle Zustände zusammen mit ihrer ID an, die der entsprechencountryId geliefert von der AJAX-Anfrage, aber dieList wird nicht an JSP zurückgegeben.

Der zum Senden dieser AJAX-Anfrage verwendete JavaScript-Code warnt vor einem Fehler. Es scheint, dass es einige Probleme mit der JSON-Zuordnung gibt. Dasselbe funktionierte mit der früheren Version des Spring-Frameworks (3.0.2). Ich bin nicht sicher, warum dies Probleme mit der höheren Version von Spring verursacht, die 3.2.0 ist. Gibt es irgendetwas mit der Spring-Version 3.2.0, das mir fehlen könnte?

Wenn Sie den JavaScript-Code sehen müssen, lautet der vollständige JavaScript-Code, um dies zu erreichen, wie folgt.

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

Natürlich befindet sich die Jackson-Bibliothek im Klassenpfad, und ich erhalte keine Fehler oder Ausnahmen auf der Serverseite. Die AJAX-Anforderung ist erfolgreich und geht über Spring und die Typenliste an das DAOList<Object[]> wird aus der Datenbank abgerufen, ist jedoch keine Antwort von JSON auf JSP (die einem JavaScript-Array zugeordnet werden könnte / sollte). Vermutlich fehlt bei der JSON-Zuordnung etwas, was bei der früheren Version von Spring jedoch nicht der Fall war.

BEARBEITEN:

Ich habe versucht zu analysierenList<Object[]> in beiden Frameworks 3.0.2 und 3.2.0 wie z

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

Die Dateitemp.json enthält die folgende Zeichenfolge.

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

In beiden Fällen (mit beiden Frameworks). Daher sollte die JSON-Antwort in beiden Fällen identisch sein.

Dastemp.json Die Datei kann auch wie folgt deserialisiert werden.

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

}

Es funktioniert gut und dieforeach Schleife iteriert über dieList vom TypList<Object[]>. Das Problem kann also durch das Spring-Framework selbst verursacht werden. Was sonst noch benötigt wird, weiß ich nicht. Warum wird es nicht von Jackson abgebildet?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage