2016-06-16 6 views
0

私は練習用のWebアプリケーションを持っています。 とjsonの返品に関する問題があります。Spring 3.0がjsonの文字列を疑問符(ResponseEntity)として返しました

UTF-8としてエンコードされたunicode文字列は、通常orclデータベースに格納されます。 とサーバフェーズでは、このユニコード文字列は通常の状態 ですが、このユニコード文字列はフロントエンド側(angularjs)に疑問符として表示されます。 フロントエンド側のすべてのunicode文字列が疑問符として表示されます。

私は今多くのことを試して、この問題のために多くの場所を探しました。 私はこのために何をしなければならないのか分かりません。

私は、これはコントローラメソッドで春3.0.5、Angular.js 1.2、Oracleデータベース、Tomcatの7

を使用しています。

@RequestMapping(value = {"/categories"}, method = RequestMethod.GET, headers = "Accept=application/json") 
@ResponseBody 
public ResponseEntity<String> getCategories() throws ParseException, UnsupportedEncodingException { 

    List<Category> categories= postService.getCategories(); 

    HttpHeaders headers = new HttpHeaders(); 
    headers.add("Content-Type", "application/json; charset=utf-8"); 

    if (categories == null) { 
     return new ResponseEntity<String>(headers, HttpStatus.NOT_FOUND); 
    } 

    return new ResponseEntity<String>(JSONResponseUtil.getJSONString(categories), headers, HttpStatus.OK); 
} 

この

が私のapplicationContext.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:aop="http://www.springframework.org/schema/aop" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xmlns:jdbc="http://www.springframework.org/schema/jdbc" 
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring" 
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd 
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd 
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 


<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> 
    <property name="url" value="jdbc:oracle:thin:@:1521:ORCL" /> 
    <property name="username" value="" /> 
    <property name="password" value="" /> 
    <property name="maxActive" value="20" /> 
    <property name="maxWait" value="6000" /> 
    <property name="poolPreparedStatements" value="true" /> 
    <property name="defaultAutoCommit" value="true" /> 
    <property name="initialSize" value="10" /> 
    <property name="maxIdle" value="20" /> 
    <property name="validationQuery" value="select sysdate from dual" /> 
    <property name="testWhileIdle" value="true" /> 
    <property name="timeBetweenEvictionRunsMillis" value="7200000" /> 
</bean> 


<bean id="transactionManager" 
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 


<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"> 
    <property name="typeAliasesPackage" value="acutls.model" /> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="configLocation" value="/WEB-INF/mybatis-config.xml" /> 
    <property name="mapperLocations"> 
     <array> 
      <value>classpath*:/acutls/mybatis/repository/mapper/**/*.xml</value> 
     </array> 
    </property>  
</bean> 

<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> 
    <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactoryBean" /> 
</bean> 

<tx:annotation-driven transaction-manager="transactionManager" /> 

<?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:mvc="http://www.springframework.org/schema/mvc" 
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
    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-3.0.xsd"> 

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

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
</bean> 
<context:annotation-config /> 
<mvc:annotation-driven/> 
<mvc:resources location="/UploadedImage/" mapping="/UploadedImage/**"/> 
<mvc:resources location="/resources/" mapping="/resources/**"/> 

<mvc:view-controller path="/Login" view-name="/resources/templates/login.html"/> 
<mvc:view-controller path="/" view-name="/resources/templates/index.html"/> 

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
      <bean class="org.springframework.http.converter.StringHttpMessageConverter"> 
       <property name="supportedMediaTypes"> 
        <list> 
         <value>application/json;charset=utf-8</value> 
         <value>application/json</value> 
        </list> 
       </property> 
      </bean> 
     </list> 
    </property> 
</bean> 


</beans> 

とangular.jsは、htmlファイルを表示第二スプリング設定ファイルで、データは$スコープに保存されています.categories

<div class="modal fade" id="beforeWriteModal" tabindex="-1" 
    role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> 
    <div class="modal-dialog"> 
     <div align="center" class="modal-content"> 
      <div class="modal-header"> 
       <h4 class="modal-title">where did you travel?</h4> 
      </div> 
      <div class="modal-body-beforeWriteModal"> 
       <input class="form-control" ng-blur="checkPostInfo()" type="text" ng-model="post.title" placeholder="enter title here" required /> 
       <select class="form-control" ng-model="post.category" ng-options="c.categoryId as c.categoryName for c in categories"></select> 
      </div> 
      <div align="left" class="modal-footer"> 
       <input id="postcheckbtn" class="btn btn-primary" type="button" 
        value="submit" ng-click="hideinfomodal()" /> 
      </div> 
     </div> 
    </div> 
</div> 

及びサンプルデータ

{ 
"postId": "POST14042622131875", 
"realPath": "1398517998159_8.jpeg", 
"title": "신혼여행", 
"textContent": "", 
"nickName": "Demian", 
"userId": "Demian", 
"categoryName": "스페인", 
"categoryId": "ES" 
} 

及びエラーデータ

{ 
"postId": "POST14042622131875", 
"realPath": "1398517998159_8.jpeg", 
"title": "????", 
"textContent": "", 
"nickName": "Demian", 
"userId": "Demian", 
"categoryName": "???", 
"categoryId": "ES" 
} 

debug response screen capture

+0

私は、このデータを表示するために使用されているangularjsコードを現在共有しているサンプルデータを共有します。 – Mudassar

+0

サンプルデータとangularjsコードを追加しました。 – Demian

答えて

1

あなたは例えばResponseEntityヘッダを設定する必要がありますヘッダーのcontent-typeがデフォルトの文字セットISO-8859-1

を使用する設定されていない

@RequestMapping("/test22") 
@ResponseBody 
public ResponseEntity<String> test22(){ 
    MultiValueMap<String, String> map=new LinkedMultiValueMap<>(); 
    map.put("Content-Type", Lists.newArrayList("text/html;charset=UTF-8")); 
    return new ResponseEntity<String>("you body",map , HttpStatus.OK); 
} 

StringHttpMessageConverter

@Override 
protected void writeInternal(String str, HttpOutputMessage outputMessage) throws IOException { 
    if (this.writeAcceptCharset) { 
     outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets()); 
    } 
    Charset charset = getContentTypeCharset(outputMessage.getHeaders().getContentType()); 
    StreamUtils.copy(str, charset, outputMessage.getBody()); 
} 
+0

私はあなたのコードを試しましたが、それは助けになりませんでした。 – Demian

+0

class StringHttpMessageConverterでデバッグwriteInternal – liaozq

0

あなたはエンコーディングフィルタを宣言することもできます。

<filter> 
    <filter-name>encodingFilter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>encodingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
+0

ありがとうございますが、このコードはすでに適用されています。 – Demian

0
  • 最初に、ソースがすなわちpostService.getCategories();は実際には、正しい形式のデータを返している
  • 最初の可能性は除外され、その後、私の仮定は、あなたは、単にコードでcharset=UTF-8を追加する必要がある場合 @RequestMapping(method=RequestMethod.GET, produces={"application/json; charset=UTF-8"})
  • その後、私が使用することをお勧めします上記の2はいけない仕事ならばGSON
+0

1. postService.getCategories()は正しいデータを返します。 2.提案は春バージョン3.2以降が必要ですが、私は春3.0.5を使用しています。 3. POJOをJSON文字列に変換するときにgsonを使用しています。 – Demian

関連する問題