Verarbeitung von REST API headers

lusitano

Aktives Mitglied
Hallo Leute,

ich habe hier ein Verständnisproblem mit den headers in meinem Controller. Für i18n meiner Anwendung habe ich verschiedene messages files erstellt.
Diese Liegen unter resources/i18n. Dazu habe ich die Klasse I18NConfig.
Java:
@Configuration
public class I18NConfig {

    @Bean
    public AcceptHeaderLocaleResolver localeResolver() {

        final AcceptHeaderLocaleResolver resolver = new AcceptHeaderLocaleResolver();
        resolver.setDefaultLocale(Locale.US);
        // TEST Setting System default Locale to US
        Locale.setDefault(Locale.US);

        return resolver;
    }

    @Bean
    public ResourceBundleMessageSource messageSource() {

        final ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasename("i18n/messages");
        messageSource.setDefaultEncoding("UTF-8");

        return messageSource;
    }
}

und die Klasse ValidatorConfig
Java:
@Configuration
@RequiredArgsConstructor
public class ValidatorConfig {

    private final I18NConfig i18NConfig;

    @Bean
    LocalValidatorFactoryBean getValidator() {

        LocalValidatorFactoryBean validatorFactoryBean = new LocalValidatorFactoryBean();
        validatorFactoryBean.setValidationMessageSource(i18NConfig.messageSource());

        return validatorFactoryBean;
    }
}

dazu meinen Controller CustomerController
Java:
@RestController
@RequestMapping("/v1/customers")
@Validated
@Slf4j
@RequiredArgsConstructor
@Tag(name = "Customers API")
public class CustomerController {

    private final CustomerService customerService;

    @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<CustomerResponseDto> saveCustomer(@Valid
                                                            @RequestBody CustomerRequestDto customerRequestDto,
                                                            @RequestHeader HttpHeaders headers) {

        Customer customer = customerService.saveCustomer(customerRequestDto);

        URI location = ServletUriComponentsBuilder
                .fromCurrentRequest()
                .path("/{customerId}")
                .buildAndExpand(customer.getId())
                .toUri();

        log.info("Customer: {} saved.", customerRequestDto);

        return ResponseEntity.created(location).build();
    }

}

Obwohl ich @RequestHeader HttpHeaders headers nicht verarbeite kann ich in Postman über Accept-Language die Fehlermeldungen in einer anderen Sprache ausgeben lassen.

Wie ist den hier die richtige Vorgehensweise?
 
Das ist für mich die Frage.
Ich habe keine Ahnung wie ich die empfangenen header verarbeiten kann.
Ich dachte ich müsste den empfangenen Header verarbeiten z.B. irgendwas in die Richtung

Pseudocode:
Java:
for (String header : headers ) {
    
    acceptLanguage = headerLanguage.get()
}

resolver.changeSystemLanguage(acceptLanguage)
 
Also es funktioniert alles so wie du möchtest, du verstehst nur nicht warum?

Oder funktioniert irgendwas nicht so, wie du möchtest?
 
Ja es funktioniert wie ich will. Durch den empfangenen header Accept-Language=de oder Accept-Language=us wird je nachdem die richtige i18n message ausgegeben. Und ja ich verstehe nicht ganz warum das so ist. Weil, wie oben im Pseudocode beschrieben, dachte ich das ich den header verarbeiten muss.
 

Neue Themen


Zurück
Oben