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