Spring Restful 服务只返回英文字符,但除英文以外的其他字符显示为'?'
Spring Restful service is only returning English characters but other characters except English is displayed as '?'
我已经使用 Spring MVC 4.0.1
构建了一个 Restful 网络服务。控制器正在 returning 响应浏览器中的每个英文单词和字符。但是 NON-ENGLISH
的每个单独字符都被 return 编辑为 ?
。
例如对于 नेपाल
(尼泊尔语发音为 Nepal
),它 returning 为 ????
。
这是我的 RestController
class:
@RestController
public class TestController {
private final ApplicationContext applicationContext;
@Autowired
public TestController(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
@RequestMapping(value = {"/test/{test}"})
public String getLatestCategoryNews(
@PathVariable("categories") String categories,
@RequestParam String test)
{
return "नेपाल";
}
}
这是我的 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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<context:component-scan base-package="com.billions.news.web.controller"/>
<mvc:annotation-driven />
这是我的 web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
这是我的申请-context.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:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd>
<context:property-placeholder location="application.properties"/>
<context:component-scan base-package="com.test.web"/>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
当我使用 json-io return 响应将其转换为 json 字符串时,在 IDE 控制台中我可以获得所需的文本。但是当我在浏览器中收到响应时,它会转换回“????”。这让我很烦恼。
我也在 @RequesMapping
上使用了以下内容:
method = RequestMethod.GET,
produces = MediaType.ALL_VALUE
但它仍然会产生与“????”相同的响应。
我在网上尝试了很多解决方案,包括 filters
。但是 none 帮助了他们。
我正在使用 tomcat 作为服务器。
有什么方法可以让我在 spring-mvc restcontroller 中得到任何语言的回复,包括英语。
编辑:
以下解决了问题:
我所要做的就是替换
<mvc:annotation-driven />
和
<mvc:annotation-driven >
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/html;charset=UTF-8" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
首先,在您的控制器方法 getLatestCategoryNews
中,您将返回 String
,这意味着 spring 将选择一个已注册的 HttpMessageConverters
,在您的情况下将是 StringHttpMessageConverer
(here 是文档),它将负责编写返回的 String
。
此 StringHttpMessageConverer
的默认字符集
default constructor that uses "ISO-8859-1" as the default
charset.
您应该覆盖此消息转换器的字符集。
只需注册bean:
<beans class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<array>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/html;charset=UTF-8" />
</bean>
</array>
</property>
</beans>
来自我的更新
你还应该在maven中设置项目编码pom.xml
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
来自@Computergodzilla 的更新
我必须做的是用
删除 <mvc:annotation-driven/>
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/html;charset=UTF-8" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
我已经使用 Spring MVC 4.0.1
构建了一个 Restful 网络服务。控制器正在 returning 响应浏览器中的每个英文单词和字符。但是 NON-ENGLISH
的每个单独字符都被 return 编辑为 ?
。
例如对于 नेपाल
(尼泊尔语发音为 Nepal
),它 returning 为 ????
。
这是我的 RestController
class:
@RestController
public class TestController {
private final ApplicationContext applicationContext;
@Autowired
public TestController(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
@RequestMapping(value = {"/test/{test}"})
public String getLatestCategoryNews(
@PathVariable("categories") String categories,
@RequestParam String test)
{
return "नेपाल";
}
}
这是我的 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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<context:component-scan base-package="com.billions.news.web.controller"/>
<mvc:annotation-driven />
这是我的 web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
这是我的申请-context.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:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd>
<context:property-placeholder location="application.properties"/>
<context:component-scan base-package="com.test.web"/>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
当我使用 json-io return 响应将其转换为 json 字符串时,在 IDE 控制台中我可以获得所需的文本。但是当我在浏览器中收到响应时,它会转换回“????”。这让我很烦恼。
我也在 @RequesMapping
上使用了以下内容:
method = RequestMethod.GET,
produces = MediaType.ALL_VALUE
但它仍然会产生与“????”相同的响应。
我在网上尝试了很多解决方案,包括 filters
。但是 none 帮助了他们。
我正在使用 tomcat 作为服务器。
有什么方法可以让我在 spring-mvc restcontroller 中得到任何语言的回复,包括英语。
编辑:
以下解决了问题: 我所要做的就是替换
<mvc:annotation-driven />
和
<mvc:annotation-driven >
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/html;charset=UTF-8" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
首先,在您的控制器方法 getLatestCategoryNews
中,您将返回 String
,这意味着 spring 将选择一个已注册的 HttpMessageConverters
,在您的情况下将是 StringHttpMessageConverer
(here 是文档),它将负责编写返回的 String
。
此 StringHttpMessageConverer
default constructor that uses "ISO-8859-1" as the default charset.
您应该覆盖此消息转换器的字符集。
只需注册bean:
<beans class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<array>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/html;charset=UTF-8" />
</bean>
</array>
</property>
</beans>
来自我的更新
你还应该在maven中设置项目编码pom.xml
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
来自@Computergodzilla 的更新
我必须做的是用
删除<mvc:annotation-driven/>
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/html;charset=UTF-8" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>