如何在@RestController约束下设置spring javax.validation属性?

我以为我可以只添加/src/main/resources/messages.propertiesmessages_de.properties,然后spring可以检测到它们并启用适当的i18n?但这似乎并非如此:

@RestController
public void TestController {
       @PostMapping
       public void post(@Valid @RequestBody Person p) {
       }
}

public class Person {
       private String firstname;

       @javax.validation.constraints.NotBlank(message = "{errors.person.lastname}")
       private String lastname;
}

messages.properties:
errors.person.lastname=person should provide a lastname

messages_de.properties:
errors.person.lastname=Person ohne Nachnamen


问题:如果我现在发送一个POST请求:

{
    "exception": "org.springframework.web.bind.MethodArgumentNotValidException",
    "message": "'lastname': {errors.person.lastname}"
}


问题1:我真的必须告诉Spring明确地按如下方式应用i18n吗?还是可以以某种方式依靠自动检测功能?

下一步是添加以下配置。现在,默认消息已正确解析。但是,每当我要验证i18n时是否有必要真的添加它?

@Configuration
public class MessageSourceConfig {
    @Bean
    public LocalValidatorFactoryBean localValidatorFactoryBean() {
        LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
        bean.setValidationMessageSource(messageSource());
        return bean;
    }

    @Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource bundle = new ResourceBundleMessageSource();
        bundle.setBasenames("messages");
        return bundle;
    }
}


问题2:我需要那些bean:我现在如何发送帖子请求以切换语言?
我尝试添加诸如?local=de, locale=de, ?lang=de, language=de之类的get-query参数,但是它们都不起作用...

最佳答案

在@M的帮助下。上面的Deinum,这是缺少的和平:

    @Bean
    public LocalValidatorFactoryBean localValidatorFactoryBean(MessageSource messageSource) {
        LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
        bean.setValidationMessageSource(messageSource);
        return bean;
    }


然后必须发送带有http标头Accept-Language=de的Web请求。

关于java - 如何在java.validation约束上使用Spring RestController?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55220453/

10-11 00:58
查看更多