1

Springフレームワークバージョン3.0.2とHibernate(NetBeans 6.9.1)を使用してWebアプリケーションを操作していました。後で、前の質問の1つで述べたように、複数のファイルのアップロードで問題を引き起こしているバグの1つがあることに気付きました。

ソリューションの取得に苦労しましたが、成功しませんでした。そのため、Springバージョンを3.2.0にアップグレードしました。

以前のバージョン(3.0.2)では、AJAXはJackson 1.9.8(そのダウンロードページ)で正常に動作していましたが、新しいバージョン(3.2.0)では、すべて正常に動作しますが、AJAX呼び出しはJavaScriptコードのあらゆる場所でエラーを警告します。

国選択ボックスで国の1つが選択され、対応する状態リストがDAOとともにSpringコントローラーから取得されるというシナリオが1か所にあります。SpringコントローラでURLにマッピングされる方法は次のとおりです。

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

このメソッドは、国選択ボックスで国が選択されたときに呼び出されます。このgetStateSelectBox()メソッドは、DAOクラスの1つで次のように定義されています。

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

ループはデモンストレーションのためだけのものであり、AJAXリクエストによって提供されたforeachものに対応するIDとともにすべての状態を表示しますが、 JSPには返されません。countryIdList

この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のを繰り返します。したがって、問題はSpringフレームワーク自体が原因である可能性があります。他に何が必要か、わかりません。なぜそれはジャクソンによってマッピングされないのですか?ListList<Object[]>

4

2 に答える 2

2

Springフォーラムにも同じ投稿があります。最終的に私のために働いた質問への回答からの解決策は、dispatcher-servlet.xml次のようにファイルを構成する必要がありました。

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" />

<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="false" />
    <property name="favorParameter" value="false" />
    <property name="ignoreAcceptHeader" value="false" />
    <property name="mediaTypes" >
        <value>
            atom=application/atom+xml
            html=text/html
            json=application/json
            *=*/*
        </value>
    </property>
</bean>

これにより、JSONはJackson1.9.8およびSpring3.2.0で動作するようになりました。これは、その質問へのすべての回答にクレジットされます。


私のファイル全体dispatcher-servlet.xmlは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"

       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">


    <context:component-scan base-package="controller" />
    <context:component-scan base-package="validatorbeans" />

    <mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" />
    <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
        <property name="favorPathExtension" value="false" />
        <property name="favorParameter" value="false" />
        <property name="ignoreAcceptHeader" value="false" />
        <property name="mediaTypes" >
            <value>
                atom=application/atom+xml
                html=text/html
                json=application/json
                *=*/*
            </value>
        </property>
    </bean>


    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="index.htm">indexController</prop>

            </props>
        </property>
    </bean>

    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" />

    <bean name="indexController"
          class="org.springframework.web.servlet.mvc.ParameterizableViewController"
          p:viewName="index" />
</beans>
于 2012-12-31T14:30:14.370 に答える
1

Spring 3.1.3を使用していますが、Jacksonマッピングが応答にルートオブジェクトを作成しようとしていることがわかりました。これはJackson2マッパーを使用したものです。私は古いジャクソンマッパーを試していません。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でどのような変更を行う必要があるかを確認する必要があります。

于 2012-12-27T19:55:12.113 に答える