【问题标题】:Spring MVC Ajax call Post request body with 415 errorSpring MVC Ajax 调用 Post 请求正文,出现 415 错误
【发布时间】:2019-01-27 06:32:31
【问题描述】:

我正在做 Spring MVC 的演示。我创建了带有数据主体的 ajax 调用 post 请求,但 Spring 似乎无法识别我的请求及其参数(返回状态 415)。它甚至不能调用我的控制器。

var jsonSTr = JSON.stringify(products);
var data = {};
data["products"] = jsonSTr;

$.ajax({
    type: "POST",
    url: urlReq, --> "/mastercard/render"
    data: JSON.stringify(data),
    beforeSend: function (xhr) {
           xhr.setRequestHeader("Accept", "application/json");
           xhr.setRequestHeader("Content-Type", "application/json");
    },
   }).done(function (data, textStatus, jqXHR) {
                    console.log(textStatus);
});

这是我的java代码

@RequestMapping(value="/mastercard/render", method = RequestMethod.POST,produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ModelAndView renderToMasterCardForm(@RequestBody CheckoutRenderRequest checkoutRenderRequest) {
    List<Product> paidProducts = this.jsonToListProduct(checkoutRenderRequest.getProducts());

    ModelAndView viewModel = new ModelAndView("mastercardform");
    Response response = new Response();
    response.status = "ok";
    response.url = "mastercardform";
    response.price = String.valueOf(paidProducts.parallelStream().collect(Collectors.summarizingDouble(Product::getPrice)).getSum());
    ;
    viewModel.addObject("result", response);
    return viewModel;
 }

CheckoutRequest

private static class CheckoutRenderRequest {
    private String products;

    public String getProducts() {
        return products;
    }

    public void setProducts(String products) {
        this.products = products;
    }
}

我已经尝试过这么多的解决方案,但它仍然不起作用。我的代码引用自这些网站https://www.javacodegeeks.com/2013/09/spring-mvc-ajax-jquery.htmlPOST JSON fails with 415 Unsupported media type, Spring 3 mvchttp://www.mkyong.com/spring-mvc/spring-4-mvc-ajax-hello-world-example/,但它们没有帮助。我真的不知道我做错了什么,请帮忙。

【问题讨论】:

    标签: jquery ajax spring spring-mvc


    【解决方案1】:

    JSON.stringify 不转换变量数据,直接使用即可。

    var data = {products: JSON.stringify(xx)};
    $.ajax({
        data: data,
        url: xx
     });
    

    【讨论】:

      【解决方案2】:

      我测试了你的代码,它可以工作。

      我的 ajxa(和你的一样):

      var jsonSTr = JSON.stringify({"ddd":"sss", "der":"fvgb"});
          var data = {};
          data["products"] = jsonSTr;
      
          $.ajax({
              type: "POST",
              url: '/mastercard/render',
          data: JSON.stringify(data),
              beforeSend: function (xhr) {
              xhr.setRequestHeader("Accept", "application/json");
              xhr.setRequestHeader("Content-Type", "application/json");
          },
          }).done(function (data, textStatus, jqXHR) {
              console.log(textStatus);
          });
      

      我的控制器(与您的控制器相同,只是为了测试,返回值略有变化):

      @RequestMapping(value="/mastercard/render", method = RequestMethod.POST,produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
          @ResponseBody
          public ModelAndView renderToMasterCardForm(@RequestBody CheckoutRenderRequest checkoutRenderRequest) {
              System.out.println(checkoutRenderRequest.getProducts());
      
              ModelAndView viewModel = new ModelAndView("mastercardform");
      
              viewModel.addObject("result", "Hi");
              return viewModel;
          }
      

      我的实体(与您相同,但将私有静态类更改为公共):

      public class CheckoutRenderRequest {
          private String products;
      
          public String getProducts() {
              return products;
          }
      
          public void setProducts(String products) {
              this.products = products;
          }
      }
      

      我的完全控制者:

      @Controller
      @RequestMapping(value = "/")
      public class Test {
      
          @RequestMapping(value = "/")
          public String index() {
              return "index";
          }
      
          @RequestMapping(value="/mastercard/render", method = RequestMethod.POST,produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
          @ResponseBody
          public ModelAndView renderToMasterCardForm(@RequestBody CheckoutRenderRequest checkoutRenderRequest) {
              System.out.println(checkoutRenderRequest.getProducts());
      
              ModelAndView viewModel = new ModelAndView("mastercardform");
      
              viewModel.addObject("result", "Hi");
              return viewModel;
          }
      }
      

      我在 index.jsp 页面中调用了你的 ajax

      【讨论】:

      • 它是如何工作的?控制器没有被调用,它总是得到状态 415。或者你是否使用任何有助于映射请求的配置?
      【解决方案3】:

      添加依赖

      <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.8</version>
      </dependency>
      

      尝试检查您的 spring mvc 配置是否注册了 json 转换器

      <mvc:annotation-driven>
      <mvc:message-converters register- defaults="true">
      <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
      <property name="supportedMediaTypes">
      <list>
      <value>text/html;charset=UTF-8</value>
      <value>application/json</value>
      </list>
      </property>
      </bean>
      </mvc:message-converters>
      </mvc:annotation-driven>
      

      【讨论】:

        猜你喜欢
        • 2017-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-31
        相关资源
        最近更新 更多