私はスプリングブート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で
リクエストを同じクライアントから送信していますか(ローカルでもステージでも)? – Codo
はい、同じローカルPostmanクライアントはステージングで問題を再現しますが、サーバーをローカルで実行しても正常に動作します。 – Nom1fan