我在 springmvc 中创建了一个应用程序界面并使用@Pathvariable 来接受用户的输入,这是我的@Controller 代码片段:
@RequestMapping(value = "/getFirst/{var}", method = RequestMethod.GET)
public @ResponseBody String getFirst(@PathVariable String var){
String fr = "select * from Food f where f.resname like '%" + var + "%'";
List<Site> siteList = siteService.findBySQL(fr);
Site first = siteList.get(0);
return first.getSrc();
}
在这里,我将我的应用程序部署到本地 tomcat 服务器并输入 url http://localhost:8080/springmvc/getFirst/鸡排
并正常得到结果。
但是当我将应用程序部署到远程 tomcat 服务器并键入相同的参数 http://xxx.xx.xx.xxx:8080/springmvc/getFirst/鸡排
并得到以下异常:
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
java.util.ArrayList.rangeCheck(ArrayList.java:635)
java.util.ArrayList.get(ArrayList.java:411)
cn.crabime.StudentController.getFirst(StudentController.java:99)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
cn.crabime.filter.FoodFilter.doFilter(FoodFilter.java:22)
首先,我认为可能是汉字编码的问题,但我已经定义了一个FoodFilter来拦截输入的url,发现汉字已经被编码了。
其次,我以为是hibernate在处理汉字问题,但是可以看到本地服务器正常,应该不是。但我印象最深的地方,在使用本地服务器时,IntelliJ idea 正常输出hibernate生成的sql语句,汉字没有抓取,但是在远程服务器上是这样的:
当前用户请求的url为http://139.129.229.46:8080/springmvc/getFirst/%E9%B8%A1%E6%8E%92
last slice is :鸡排
Hibernate: select * from Food f where f.resname like '%鸡æ%'
但我不知道为什么?
最佳答案
好的,这个问题自己解决了,here is an article about tomcat dealing with chinese character garbled issue .只是因为tomcat默认的字符编码是iso-8859-1,这样的编码方式会导致汉字乱码,所以到远程tomcat服务器的conf文件夹中修改这样的片段:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="2000"
minSpareThreads="100"
maxSpareThreads="1000"
acceptCount="1000"
URIEncoding="UTF-8" />
注意:URIEncoding必须指定为'UTF-8'。
关于java - 在远程服务器中抓取的 Hibernate 输出汉字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39785668/