我正在使用 Spring Framework 4.3.2
关于Rest
对于POST
和PUT
会发生以下情况。
对于POST
,我有以下内容:
@PostMapping(consumes={MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_UTF8_VALUE})
public ResponseEntity<Void> saveOne(@Validated @RequestBody Persona persona){
观察该方法已声明@Validated
。
我需要根据客户端/用户发送的Locale
进行验证并返回错误文本消息。
我可以通过Spring MVC Test
来做到这一点,因为我有以下内容:
resultActions = mockMvc.perform(post(uri).contentType(MediaType.APPLICATION_XML)
.accept(MediaType.APPLICATION_XML)
.locale(locale)
.content(...content...))).andDo(print());
观察.locale(locale)
部分。
直到这里关于 JUnit
通过 @Parameters
我能够发送 Locale
列表,从而看到不同语言的错误消息。直到这里一切都如预期
现在,访问 Rest Controller 的另一种方法是通过 RestTemplate
我有以下内容:
RequestEntity<Persona> requestEntity = RequestEntity.post(uri)
.contentType(MediaType.APPLICATION_JSON_UTF8)
.accept(MediaType.APPLICATION_JSON_UTF8)
.body(personaValid);
....
ResponseEntity<GenericCollection<ValidatedFieldErrorReport>> responseEntity_
= restTemplate.exchange(requestEntity, parameterizedTypeReference);
遗憾的是RequestEntity
通过post
不支持.locale(locale)
即使我添加 .header("Accept-Language", locale.toString())
它也不起作用,同样考虑 .header("locale", locale.toString ())
。
注意:我可以确认,当我打印 RequestEntity
对象时,它会发送预期的 Locale
but服务器:它忽略发送给它的“区域设置”(如果从一开始就没有发送过它怎么办)并使用服务器中可用的默认区域设置
。我对这种方法感到困惑。
我想保留 RequestEntity
和 ResponseEntity
对象。他们的 API 非常流畅。
那么正确的做法是什么呢?我的印象是客户端或服务器中的额外配置在某些地方需要它。
最佳答案
对于RequestEntity
,您应该使用:
.header(HttpHeaders.ACCEPT_LANGUAGE, locale.toLanguageTag());
关于用于休息的 Spring MVC : How set a Locale value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39574080/