2017-01-28 4 views
1

私はスプリングブートmvcを使用していますが、私のステージングマシンでのみ再生できますが、私は次のようなJSON reqeustを送っていますスプリングブートヘブライ語でリクエストを送信するときに、特定のマシン上のUTF-8中間バイトが無効

(「何でも」フィールドの下に、ヘブライ語の文字に注目):

{ 
"messageInitiaterId":"0542258808", 
"destinationId":"0544556543", 
"whatever":"משהו", 
"pushToken":"e2eeb632-8c2c-4ad2-a163-cfeb671d1955", 
"androidVersion":"7.1.1", 
"deviceModel":"huawei nexus 6p", 
"appVersion":"1.42" 
} 

はローカル、それが応答を返し、すべてが順調です。ステージングマシンで返されるレスポンスは次のとおりです。

{ 
    "timestamp": 1485591099485, 
    "status": 400, 
    "error": "Bad Request", 
    "exception":   

    "org.springframework.http.converter.HttpMessageNotReadableException", 
    "message": "Could not read document: Invalid UTF-8 middle byte 0x3f\n at [Source: [email protected]; line: 4, column: 17]; nested exception is com.fasterxml.jackson.core.JsonParseException: Invalid UTF-8 middle byte 0x3f\n at [Source: [email protected]; line: 4, column: 17]", 
    "path": "/v1/IsRegistered" 

} 

現在、これを再現するために郵便番号を使用しています。リクエストのヘッダーは次のとおりです。

"Content-Type":"application/json; charset=UTF-8" 

私はまた、Windows 8を実行しているマシン自体にヘブライ語を追加しようとしましたが、違いを作るようには見えませんでした。

ありがとうございます。

EDIT

これは提案MediaTypeを追加することが、まだ同じエラーを取得し、コントローラである:

@Controller 
public class IsRegisteredController extends AbstractController { 

private final IsRegisteredLogic logic; 

@Autowired 
public IsRegisteredController(IsRegisteredLogic logic) { 
    this.logic = logic; 
} 

@ResponseBody 
@RequestMapping(value = "/v1/IsRegistered", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) 
public Response<UserDTO> isRegistered(@Valid @RequestBody IsRegisteredRequest request, HttpServletResponse response) { 
    return logic.execute(request, response); 
} 
} 

EDIT2:

は提案をしようとしました下に、私が見つけた他のものそれはすべて違いがありませんでした。これは私が思ったよりも難しい問題のようです。

次のフィールドapplication.propertiesに追加:

spring.http.encoding.charset=UTF-8 
spring.http.encoding.enabled=true 
spring.http.encoding.force=true 
spring.datasource.connectionproperties=useUnicode=true;characterEncoding=utf-8; 

ならびに以下の豆を:

@Bean 
public TomcatConnectorCustomizer tomcatConnectorCustomizer() { 
    return connector -> connector.setURIEncoding("UTF-8"); 
} 

@Bean 
public Filter characterEncodingFilter() { 
    CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); 
    characterEncodingFilter.setEncoding("UTF-8"); 
    characterEncodingFilter.setForceEncoding(true); 
    return characterEncodingFilter; 
} 

すべてが無駄になります。何が起きてる?確かにアプリケーション/ JSONに消費明示的に設定、ブートが...リクエストにお使いのコントローラメソッドの@RequestMappingで

+0

リクエストを同じクライアントから送信していますか(ローカルでもステージでも)? – Codo

+0

はい、同じローカルPostmanクライアントはステージングで問題を再現しますが、サーバーをローカルで実行しても正常に動作します。 – Nom1fan

答えて

3

ローカル開発マシンとステージングマシンの違いは、言語とテキストのエンコーディングの設定が異なることです。アプリケーションのJVMを起動するときに、それを回避するには、明示的にテキストエンコーディングを指定します。

java -Dfile.encoding=UTF-8 -jar target/myproject-0.0.1-SNAPSHOT.jar 

あなたも、エンコーディングが正しく設定されていない場合は開始からTomcatを防ぐためにapplication.propertiesで次のプロパティを設定することができます。

spring.mandatory_file_encoding=UTF-8 
+0

ありがとうございました! – Nom1fan

0

をヘブライ語の文字を扱うことができる春;のcharset = UTF-8

サンプル:

@RequestMapping(value = "your_url", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) 
+0

あなたの返事をありがとう。私はそれを試しましたが、残念ながら私は同じエラーが発生しています。質問を編集してコントローラを追加します。 – Nom1fan

+1

'consumes'アノテーションはフィルタとして機能します。それは言う:要求が入った場合、コンテンツタイプが "application/json"でない限り、このメソッドを呼び出さないでください。入力の出力や解釈には効果がありません。 – Codo

0

追加ファイルapplication.propertiesに次の行:

spring.http.encoding.charset=UTF-8 # Charset of HTTP requests and responses. Added to the "Content-Type" header if not set explicitly. 
spring.http.encoding.enabled=true # Enable http encoding support. 
spring.http.encoding.force=true # Force the encoding to the configured charset on HTTP requests and responses. 

最後の行が必要とされない場合があります。

+0

お返事ありがとうございます。私はまだ同じエラーが発生しています。サーバーを再起動したときにこのエントリが見つかりました。関係があるかどうかはわかりません: 'o.s.b.w.servlet.FilterRegistrationBean:マッピングフィルタ: 'characterEncodingFilter' to:[/ *]' – Nom1fan

0

あなたはtomcatを使用していますか?はいの場合、tomcatのserver.xmlのファイルコネクタ要素に値がUTF-8のURIEncoding属性があることを確認する必要があります。

<Connector port="8080" maxHttpHeaderSize="8192" 
maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 
enableLookups="false" redirectPort="8443" acceptCount="100" 
connectionTimeout="20000" disableUploadTimeout="true" 
compression="on" 
compressionMinSize="128" 
noCompressionUserAgents="gozilla, traviata" 
compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript" 
URIEncoding="UTF-8" 
/> 
+0

ありがとうございました。私は舞台裏でTomcatを使用しているSpringブートを使用しているので、server.xml、web.xml、またはapplication.properties以外のものは設定する必要はありませんでした。残りはコード内の設定です。 Springブートの内部のTomcatインスタンスでURIEncodingを設定する方法はありますか? _EDIT:_私はこれを見つけました:[link](https://github.com/spring-projects/spring-boot/issues/540)私はそれを試してみましょう。ありがとう。 – Nom1fan

+0

私はそれを試した。残念ながら、同じエラーです。 – Nom1fan

関連する問題