gpt4 book ai didi

spring-mvc - 带有请求内容类型表单的 Http Post 在 Spring MVC 3 中不起作用

转载 作者:行者123 更新时间:2023-12-03 00:03:34 25 4
gpt4 key购买 nike

代码片段:

@RequestMapping(method = RequestMethod.POST)//,  headers = "content-type=application/x-www-form-urlencoded")
public ModelAndView create(@RequestBody UserAccountBean account) {
try{
accounts.put(account.assignId(), account);
}catch(RuntimeException ex)
{
return new ModelAndView("account/registerError");
}
return new ModelAndView("account/userVerification");
}

收到请求后,我得到的是 Http Status code 415:服务器拒绝了此请求,因为请求实体的格式不受所请求方法 () 的请求资源支持。

如果我将代码更改为:

代码片段:

@RequestMapping(method = RequestMethod.POST,headers = "content-type=application/x-www-form-urlencoded")
public ModelAndView create(@RequestBody UserAccountBean account) {
try{
accounts.put(account.assignId(), account);
}catch(RuntimeException ex)
{
return new ModelAndView("account/registerError");
}
return new ModelAndView("account/userVerification");
}

我会收到 405 Method not allowed。有趣的是在响应的允许 header 中,它将 GET 和 POST 列为允许的方法。

我确实有一个类可以进行 JOSN 映射:

@Component
public class JacksonConversionServiceConfigurer implements BeanPostProcessor {

private final ConversionService conversionService;

@Autowired
public JacksonConversionServiceConfigurer(ConversionService conversionService) {
this.conversionService = conversionService;
}

public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}

public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof AnnotationMethodHandlerAdapter) {
AnnotationMethodHandlerAdapter adapter = (AnnotationMethodHandlerAdapter) bean;
HttpMessageConverter<?>[] converters = adapter.getMessageConverters();
for (HttpMessageConverter<?> converter : converters) {
if (converter instanceof MappingJacksonHttpMessageConverter) {
MappingJacksonHttpMessageConverter jsonConverter = (MappingJacksonHttpMessageConverter) converter;
jsonConverter.setObjectMapper(new ConversionServiceAwareObjectMapper(this.conversionService));
}
}
}
return bean;
}

}

从 Spring 示例复制。与 JSON 内容类型配合得很好。

一个更普遍的问题是如何使 spring mvc 请求处理程序处理不同的请求内容类型。任何建议将不胜感激。

最佳答案

不幸的是FormHttpMessageConverter(当内容类型为application/x-www-form-urlencoded时,用于@RequestBody注释的参数)无法绑定(bind)目标类(@ModelAttribute 可以)。

因此您需要@ModelAttribute而不是@RequestBody。如果您不需要将不同的内容类型传递给该方法,您可以简单地替换注释:

@RequestMapping(method = RequestMethod.POST)
public ModelAndView create(@ModelAttribute UserAccountBean account) { ... }

否则我想您可以使用适当的 headers 属性创建一个单独的方法表单处理表单数据:

@RequestMapping(method = RequestMethod.POST, 
headers = "content-type=application/x-www-form-urlencoded")
public ModelAndView createFromForm(@ModelAttribute UserAccountBean account) { ... }

编辑:另一种可能的选择是通过组合 FormHttpMessageConverter (将输入消息转换为参数映射)来实现您自己的 HttpMessageConverter WebDataBinder(将参数映射转换为目标对象)。

关于spring-mvc - 带有请求内容类型表单的 Http Post 在 Spring MVC 3 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4339207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com