带验证的Spring MVC测试JSR-303/349:区域设置或接受语言在测试中不起作用

时间:2016-09-24 19:11:23

标签: spring spring-mvc spring-mvc-test

我正在使用Spring Framework 4.3.3

@ControllerPOST

PUT我有以下情况

例如POST我有以下内容:

@PostMapping(value="/save",
             consumes=MediaType.APPLICATION_FORM_URLENCODED_VALUE,
             produces=MediaType.TEXT_HTML_VALUE)
public String saveOne(@Validated @ModelAttribute Persona persona,
        BindingResult result,
        RedirectAttributes redirectAttributes){

    logger.info("saveOne: {}", persona.toString());

    if(result.hasErrors()){
        logger.error("# Errors: {}", result.getErrorCount());
        logger.error("result: {}", result.toString());
        return "persona/saveOne";
    }

    personaRestController.saveOne(persona);

    redirectAttributes.addFlashAttribute("message", "process.successful");
    return "redirect:/message";
}

通过Web Form@PostMapping i18n保存/保存数据或验证数据如果相同的网络表单无效显示每个字段的错误消息,并基于English,例如SpanishPortugueseJSR-439。它与@Bean public LocaleChangeInterceptor localeChangeInterceptor(){ LocaleChangeInterceptor localeChangeInterceptor=new LocaleChangeInterceptor(); localeChangeInterceptor.setParamName("language"); //localeChangeInterceptor.setHttpMethods("post", "put"); return localeChangeInterceptor; } @Bean(name="localeResolver") public LocaleResolver cookieLocaleResolver(){ CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver(); cookieLocaleResolver.setCookieName("language"); cookieLocaleResolver.setDefaultLocale(new Locale("en","US")); return cookieLocaleResolver; }

有关

关于Java配置基础结构配置我有以下内容:

@EnableWebMvc
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

...

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptorConfig.localeChangeInterceptor());
    }

Spring MVC Test

问题在于@Before public void setUp(){ mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); } ... @Test public void saveOneHtmlPostInvalidMaxTest() throws Exception { logger.info("saveOneHtmlPostInvalidMaxTest"); resultActions = mockMvc.perform(post(url) .contentType(MediaType.APPLICATION_FORM_URLENCODED) .locale(locale) .header("accept-language", locale.toString()) .header("language", locale.toString()) .param("id", personaInvalidMax.getId()) .param("nombre", personaInvalidMax.getNombre()) .param("apellido", personaInvalidMax.getApellido()) .... .andDo(print()); 。我有以下内容:

                .locale(locale)
                .header("accept-language", locale.toString())
                .header("language", locale.toString())

注意观察:

.andDo(print())

即使其中一些人没有意义,他们也在那里,因为我正试图解决以下情况:

来自服务器端的验证控件的工作方式是,直到为止。

第一

我可以通过MockHttpServletRequest方法确认pt_BR打印

  

标题= {Content-Type = [application / x-www-form-urlencoded],   accept-language = [pt_BR],language = [pt_BR]}

观察@PostMapping

第二

包含以下内容的if(result.hasErrors()){ logger.error("# Errors: {}", result.getErrorCount()); logger.error("result: {}", result.toString()); return "persona/saveOne"; }

default message [id],3,3];
default message [The size for the field must be between 3 and 3]

...打印

  

7370 [测试工作者] ERROR PersonaSaveOneController - 结果:   org.springframework.validation.BeanPropertyBindingResult:4个错误   字段'id'上对象'persona'中的字段错误:被拒绝的值[0];   代码[Size.persona.id,Size.id,Size.java.lang.String,Size];参数   [org.springframework.context.support.DefaultMessageSourceResolvable:   代码[persona.id,id];参数[];默认消息[id],3,3];   默认消息[字段的大小必须介于3和3之间]

观察locale

这里有两个问题:

  • 忽略accept-languagePortuguese
  • 错误消息始终以英文打印

我需要的是根据发送的Spanish错误数据打印在LocalePortuguese中。它应该以预期的语言返回每个字段的错误消息,在本例中为Web Form

同样,当我直接使用production时,它可以正常工作,但不能通过测试。我假设存在一个内部Spring组件,它通过Testing工作,并且尚未为classpath:定义

因此,有什么需要它来实现这种方法?

BTW:通过以下内容(请参阅我使用.properties),我的src/main/resources文件位于@Bean(name="messageSource") public ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource() { ReloadableResourceBundleMessageSource resource = new ReloadableResourceBundleMessageSource(); resource.setBasenames(... "classpath:/com/manuel/jordan/validation/validation"); resource.setDefaultEncoding("UTF-8"); return resource; }

@Test

使用Rest的{​​{1}}方法可以很方便地显示并根据Localeaccept-language定义返回错误消息(访问MessageSource在服务器端,并与以前的配置工作正常)。它只是non-Rest控制器

失败了

0 个答案:

没有答案