简体   繁体   English

如何自动将Spring Form数据解析为JSON对象? (Spring,jQuery,AJAX,JSON)

[英]How to automatically parse spring form data to json object? (Spring, jQuery, AJAX, JSON)

I have a spring form that submits via ajax. 我有一个通过Ajax提交的春季表格。 Here is my form... 这是我的表格

<form:form action="addToCart" method="POST"
                modelAttribute="cartProduct">
                <form:input type="hidden" path="product.productId"
                    value="${inventory.getProduct().getProductId()}" />
                <div class="card-block" style="overflow: hidden; padding: 2%">
                    <h5 style="white-space: nowrap">
                        <a href="#" class="text-primary card-title">${inventory.getProduct().getName()}</a>
                    </h5>
                    <p class="card-text text-danger">&#8369;
                        ${inventory.getProduct().getPrice()}</p>
                    <p>
                    <div class="success-message-container">
                        <span class="text-success add-to-cart"><strong>&nbsp;</strong></span>
                    </div>
                    <div class="success-message vertical-center"
                        style="display: none;">
                        <span class="text-success add-to-cart"><strong>Added
                                to cart!</strong></span>
                    </div>
                    <form:button id="addToCart" class="btn btn-block btn-warning">Add to cart</form:button>
                    <a id="viewCart" href="viewCart" class="btn btn-block btn-warning" style="display: none;">View cart</a>
                </div>
</form:form>

Then it gets submitted via ajax code... 然后通过ajax代码提交...

$(document).ready(function() {

var form = $("form");
var url = form.attr("action");
var formMethod = form.attr("method");

form.submit(function(event) {

    event.preventDefault();

    var thisForm = this;

    $.ajax({

        url : url,
        data : $(this).serialize(),
        type : "POST",
        headers: { 
            'Content-Type': 'application/json' 
        },
        success : function(cartProduct) {
            $(thisForm).find('.success-message-container').remove();
            $(thisForm).find('.success-message').show();
            $(thisForm).find('#addToCart').hide();
            $(thisForm).find('#viewCart').toggle();
        }
    });
});

});
});

And here is the receiving rest controller... 这是接收休息控制器...

@RequestMapping(value="/addToCart", method = RequestMethod.POST)
public CartProduct addToCart(@RequestBody CartProduct cartProduct, HttpServletRequest request){

    System.out.println(cartProduct.getProduct().getProductId());
    return null;
}

However, I keep on getting this error... 但是,我不断收到此错误...

POST http://localhost:8080/tommystore/customer/addToCart 400 (Bad Request)

I have imported Jackson for automatic object mapping but it still does not work... 我已经导入了Jackson以进行自动对象映射,但是它仍然无法正常工作...

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.6.3</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.6.3</version>
    </dependency>

How can I fix this? 我怎样才能解决这个问题?

Spring use HttpMessageConverter to convert request body to the method argument . Spring使用HttpMessageConverter将请求主体转换为方法参数。 There are two format (json or xml, i prefer json) HttpMessageConverter is responsible for converting from the HTTP request message to an object and converting from an object to the HTTP response body. 有两种格式(json或xml,我更喜欢json)HttpMessageConverter负责从HTTP请求消息转换为对象以及从对象转换为HTTP响应主体。 HttpMessageConverter use you should add dataType: 'xml' or to your ajax and change the format of data to xml 使用HttpMessageConverter时,应将dataType: 'xml'或添加到ajax并将数据格式更改为xml

in the server, config XML Converter to convert you xml data to object 在服务器中,配置XML Converter以将xml数据转换为对象

@Configuration
@ComponentScan({ "yourpackage" })
public class WebConfig extends WebMvcConfigurerAdapter 
{
@Override
public void configureMessageConverters(
  List<HttpMessageConverter<?>> converters) {

    messageConverters.add(createXmlHttpMessageConverter());
    messageConverters.add(new MappingJackson2HttpMessageConverter());

    super.configureMessageConverters(converters);
}
private HttpMessageConverter<Object> createXmlHttpMessageConverter() {
    MarshallingHttpMessageConverter xmlConverter = 
      new MarshallingHttpMessageConverter();

    XStreamMarshaller xstreamMarshaller = new XStreamMarshaller();
    xmlConverter.setMarshaller(xstreamMarshaller);
    xmlConverter.setUnmarshaller(xstreamMarshaller);

    return xmlConverter;
}
}

in your XML context, register your converter 在您的XML上下文中,注册您的转换器

<context:component-scan base-package="your package" />

<mvc:annotation-driven>
    <mvc:message-converters>
       <bean
         class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>

       <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
           <property name="marshaller" ref="xstreamMarshaller" />
           <property name="unmarshaller" ref="xstreamMarshaller" />
       </bean> 
    </mvc:message-converters>
</mvc:annotation-driven>

<bean id="xstreamMarshaller" class="com.fasterxml.jackson.core" />

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM