编码请求正文

时间:2017-12-13 13:45:36

标签: json spring spring-mvc spring-boot

我使用的是一个简单的表单,用户可以在其中输入一些JSON。 我将该输入添加到请求的主体。 当我从正文中检索值时,它不会被格式化/编码为JSON。 取而代之的是像json =%7B%22vrt%22%3A%7B ...... 如何/在哪里指定正文中的值必须是JSON,以便我的控制器可以使用GSON解析它?

提前致谢。 此致

控制器

@PostMapping(value = "/api/sendMessage")
public ModelAndView sendIoTMessage(@RequestBody String json) {
    VehicleMessage vehicleMessage = new Gson().fromJson(json, VehicleMessage.class);
    MessageProcessor.postVehicleMessage(vehicleMessage);
    ModelAndView mav = new ModelAndView();
    mav.setViewName("iot");
    return mav;
}

表格

<form id="sendMessage" th:action="@{/api/sendMessage}" method="post">
    <div class="form-group">
        <input class="form-control" th:value="*{json}" id="json" name="json">
    </div>
    <button type="submit" class="btn btn-primary">Submit</button>
</form>

2 个答案:

答案 0 :(得分:1)

默认情况下,Spring使用Jackson转换器作为APPLICATION JSON,如果你想使用GSON转换器,那么你需要添加GSONConvertor。

我个人认可选项1

添加GSONConvertor的不同方法:

  1. 使用JavaConfig

    @Configuration @EnableWebMvc
    public class Application extends WebMvcConfigurerAdapter {
    
    @Override
    public void configureMessageConverters(List<HttpMessageConverter < ? >> converters) {
        GsonHttpMessageConverter gsonHttpMessageConverter = new GsonHttpMessageConverter();
        converters.add(gsonHttpMessageConverter);
    }
    

    }

  2. 使用自定义转换器

    @Configuration 公共类CustomConfiguration {

    @Bean
    public HttpMessageConverters customConverters() {
    
        Collection<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
    
        GsonHttpMessageConverter gsonHttpMessageConverter = new GsonHttpMessageConverter();
        messageConverters.add(gsonHttpMessageConverter);
    
        return new HttpMessageConverters(true, messageConverters);
    }
    

    }

  3. 使用自动配置 ..关注此link

答案 1 :(得分:0)

为什么不让Spring(de)为你序列化JSON?此功能应该开箱即用,无需任何自定义配置。

@PostMapping(value = "/api/sendMessage", consumes="application/json")
public ModelAndView sendIoTMessage(@RequestBody VehicleMessage vehicleMessage) {
    MessageProcessor.postVehicleMessage(vehicleMessage);
    ModelAndView mav = new ModelAndView();
    mav.setViewName("iot");
    return mav;
}