2016-09-19 3 views
2

ich mit Spring Framework arbeite 4.3.2Spring MVC für Rest: Wie ein Locale Wert

Über Rest für POST und PUT die folgende Situation passiert.

Für POST Ich habe folgendes:

@PostMapping(consumes={MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_UTF8_VALUE}) 
public ResponseEntity<Void> saveOne(@Validated @RequestBody Persona persona){ 

Beachten Sie die Methode @Validated erklärt.

Ich brauche die Validierung und die Fehlermeldung zurückgeben, die Locale vom Client/Benutzer gesendet wurde.

Ich kann es durch Spring MVC Test, tun dafür möchte ich folgendes haben:

resultActions = mockMvc.perform(post(uri).contentType(MediaType.APPLICATION_XML) 
        .accept(MediaType.APPLICATION_XML) 
        .locale(locale) 
        .content(...content...))).andDo(print()); 

Beachten Sie die .locale(locale) Teil.

Bis hier über JUnit bis @Parameters Ich kann eine Liste von Locale s senden und sehe so die Fehlermeldung in verschiedenen Sprachen. Bis hier alles gehen, wie

erwartet wird

nun in die andere Richtung der einen Rest-Controller für den Zugriff ist durch RestTemplate

Ich habe folgendes:

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); 

Leider RequestEntity durch die post nicht unterstützt .locale(locale)

Auch wenn ich .header("Accept-Language", locale.toString()) hinzufügen, funktioniert es nicht, gleiche Überlegung für .header("locale", locale.toString()).

Hinweis: Ich kann bestätigen, wenn ich das RequestEntity Objekt ausdrucken die Localeaber im Server erwartet sendet: es ignoriert die ‚locale‘ es gesendet (, wie wenn es nicht von der nie gesendet wurde Anfang) und verwendet den Standard Locale, der auf dem Server verfügbar ist. Ich bin verwirrt mit diesem Ansatz.

Ich möchte die RequestEntity und ResponseEntity Objekte behalten. Ihre API sind fließend.

Also, was ist der richtige Weg ?. Ich habe den Eindruck, dass eine zusätzliche Konfiguration entweder in Client oder Server erforderlich ist.

+0

Welche locale Resolver Haben Sie auf der Server-Seite konfiguriert? – zeroflagL

+0

Ich habe nur definiert, wie '@ Bean' ein' LocaleChangeInterceptor' und 'SessionLocaleResolver' mit' neuen Locale ("en", "US") 'und' registry.addInterceptor (localeChangeInterceptorConfig.localeChangeInterceptor()) ''. Scheint, eine '@ Bohne' entsprechend deiner Frage zu verfehlen –

+0

So liefert dein Resolver immer 'neues Gebietsschema (" en "," US ")'? Und Sie fragen sich, warum das Senden eines Headers "Accept-Language" keine Auswirkung hat? – zeroflagL

Antwort

0

Für RequestEntity sollten Sie verwenden:

.header(HttpHeaders.ACCEPT_LANGUAGE, locale.toLanguageTag()); 
Verwandte Themen