我正在开发一个应用程序,其中有两个下拉列表。当我从第一次下拉选择一个值,第二次下拉时,ajax调用发生在控制器上,返回的列表应该填充在第二个下拉列表中。我试过下面的代码。
jsp表格:
<form:form modelAttribute="place" action="getWeather">
<table>
<tr>
<td><form:label path="country">Country:</form:label></td>
<td>
<form:select path="country" id = "countryList">
<form:option value="#">--Select--</form:option>
<form:options items="${CountriesList}"/>
</form:select>
</td>
</tr>
<tr>
<td><form:label path="city">City:</form:label></td>
<td>
<form:select path="city" id = "cityList">
</form:select>
</td>
</tr>
</table>
</form:form>
<script type="text/javascript">
document.getElementById("countryList").addEventListener("change", myFunction);
/* $(document).ready(function(){
alert("sample msg");
}); */
function myFunction(){
var id = $(this).val()
/* var Country = { "Country" : id }
alert(Country);
alert(JSON.stringify(Country)); */
$.ajax({
type: "GET",
url: 'GetCities/' + id,
dataType: 'json',
success: function(data){
var slctSubcat=$('#cityList'), option="";
slctSubcat.empty();
for(var i=0; i<data.length; i++){
option = option + "<option value='"+data[i] + "'>"+data[i] + "</option>";
}
slctSubcat.append(option);
}
});
}
</script>
控制器方法:
@RequestMapping(value = "/GetCities/{country}", method = RequestMethod.GET)
public @ResponseBody JsonArray getCities(@PathVariable(value="country") String Country){
List<String> cities = getWeatherService.getCities(Country);
Gson gson = new Gson();
JsonElement element = gson.toJsonTree(cities, new TypeToken<List<String>>() {}.getType());
JsonArray jsonArray = element.getAsJsonArray();
return jsonArray;
}
Ajax调用成功并在列表中获取数据。但是当以JsonArray的形式将列表传递给jsp时,它会给出如下的异常。
org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type: class com.google.gson.JsonArray
org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:225)
org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:182)
org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:82)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:119)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:870)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:776)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:870)
javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:855)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
我已尝试直接传递List,但同样的问题。请帮我找到解决方案。
答案 0 :(得分:0)
最后能够解决这个问题。我没有从控制器返回JsonArray,而是返回了Json字符串。它奏效了。
@RequestMapping(value = "/GetCities/{country}", method = RequestMethod.GET)
public @ResponseBody String getCities(@PathVariable(value="country") String Country){
List<String> cities = getWeatherService.getCities(Country);
Collections.sort(cities);
Gson gson = new Gson();
String json = gson.toJson(cities);
return json;
}