我正在使用Spring Framework 4.3.3
对@Controller
或POST
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
,例如Spanish
,Portuguese
和JSR-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-language
或Portuguese
我需要的是根据发送的Spanish
错误数据打印在Locale
和Portuguese
中。它应该以预期的语言返回每个字段的错误消息,在本例中为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}}方法可以很方便地显示并根据Locale
或accept-language
定义返回错误消息(访问MessageSource
在服务器端,并与以前的配置工作正常)。它只是non-Rest
控制器