繁体   English   中英

Spring MVC 3 + JSON

[英]Spring MVC 3 + JSON

我正在尝试使用带有JSON的Spring MVC。 当从控制器返回一个对象时,它工作得很好,但是当我尝试将一个自定义对象作为参数传递给AJAX时,我收到HTTP 415错误。

我的spring-servlet.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <tx:annotation-driven /> 
   <context:annotation-config/>
    <context:component-scan
        base-package="com.sommer.controller" />
        <tx:annotation-driven transaction-manager="transactionManager"/>

    <context:component-scan base-package="com.sommer.service" />

    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/view/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <bean id="messageSource"
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="classpath:messages" />
        <property name="defaultEncoding" value="UTF-8"/>
    </bean>


 <!-- ========= [ADDED FOR JSON SUPPORT] ========= -->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
       <property name="messageConverters">
           <list>
                <ref bean="jsonConverter" />
           </list>
       </property>
    </bean>

    <bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
       <property name="supportedMediaTypes" value="application/json" />
    </bean> 


    <bean id="localeChangeInterceptor"
        class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <property name="paramName" value="lang" />
    </bean>

    <bean id="localeResolver"
        class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
        <property name="defaultLocale" value="es"/>
    </bean>

    <bean id="handlerMapping"
        class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
        <property name="interceptors">
            <ref bean="localeChangeInterceptor" />
        </property>
    </bean>


    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
      <property name="url" value="jdbc:mysql://localhost:3306/sommer"/>
      <property name="username"  value="root"/>
      <property name="password" value="master"/>
    </bean>

    <bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    p:dataSource-ref="dataSource"
    p:jpaVendorAdapter-ref="jpaAdapter">
        <property name="loadTimeWeaver">
                <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
        </property>                             
        <property name="persistenceUnitName" value="sommerPersistenceUnit"></property>
    </bean>

     <bean id="jpaAdapter"
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
    p:database="MYSQL"
    p:showSql="true"
    p:generateDdl="true"/>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
    p:entityManagerFactory-ref="entityManagerFactory"/>

    <tx:annotation-driven transaction-manager="transactionManager"/>



</beans>

我的控制器:

@RequestMapping(value="/editJSON2",headers={"content-type=application/json,application/xml,application/x-www-form-urlencoded"})
    public @ResponseBody ActionResult editJSON2(@RequestBody CustomerTO toEdit){
        return new ActionResult(toEdit);
    }

类别:

public class ActionResult {
    private Boolean success;
    private String message;
    private Object object;

    public ActionResult(){
        this.success = true;
        this.object = null;
        this.message = null;
    }

    public ActionResult(Boolean isSuccess,Object obj, String message){
        this.success = isSuccess;
        this.object = obj;
        this.message = message;
    }

    public ActionResult(Object obj){
        this.success = true;
        this.object = obj;
        this.message = "";
    }

    public ActionResult(String message){
        this.success = false;
        this.object = null;
        this.message = message;
    }

    public void setError(String msg){
        this.success = false;
        this.message = msg;
    }

    public Boolean getSuccess() {
        return success;
    }
    public void setSuccess(Boolean success) {
        this.success = success;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public Object getObject() {
        return object;
    }
    public void setObject(Object object) {
        this.object = object;
    }
}


public class CustomerTO {

    private Long id;
    private String name;
    private String email;

    private TestObject[] items;

    public TestObject[] getItems() {
        return items;
    }

    public void setItems(TestObject[] items) {
        this.items = items;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public DocumentType getDocumentType() {
        return documentType;
    }

    public void setDocumentType(DocumentType documentType) {
        this.documentType = documentType;
    }

    public String getDocumentNumber() {
        return documentNumber;
    }

    public void setDocumentNumber(String documentNumber) {
        this.documentNumber = documentNumber;
    }

    private String surname;
    private String sex;
    private DocumentType documentType;
    private String documentNumber;

    public CustomerTO() {
    }

    public CustomerTO(Customer customer) {
        this.id = customer.getId();
        this.documentNumber = customer.getDocumentNumber();
        this.documentType = customer.getDocumentType();
        this.name = customer.getName();
        this.surname = customer.getSurname();
        this.sex = Sex.MALE.equals(customer.getSex())?"M":"F";
        this.email = customer.getEmail();
        this.items = new TestObject[1];
        TestObject tio = new TestObject();
        tio.setText("ITEM !");
        this.items[0] = tio;
    }

我的ajax电话:

var currentCustomer = {
            'id': $('#id').val()
            ,'name' :$('#name').val()
            ,'surname' :$('#surname').val()
            ,'documentType' :$('#documentType').val()
            ,'documentNumber' :$('#documentNumber').val()
            ,'sex' :$('#sex').val()
            ,'email' :$('#email').val()
        };


        // Send the request
        $.post('editJSON2.html', {toEdit:currentCustomer}, function(response) {
            alert('OK');
        }, 'json');

我认为这个问题在这里:

public @ResponseBody ActionResult editJSON2(@RequestBody CustomerTO toEdit)

我认为@ResquestBody不适合我。 我也有

@RequestMapping("/editJSON")
public @ResponseBody ActionResult editJSON(@RequestParam(required=false) Long customerId){
    CustomerTO toEdit = customerId!=null ? new CustomerTO(customerService.getById(customerId)):new CustomerTO();
    return new ActionResult(toEdit);
}

当我打电话给我时,我没有问题。

这是我从萤火虫收集的信息:

Parámetrosapplication/x-www-form-urlencoded
toEdit[documentNumber]  36466
toEdit[documentType]    DNI
toEdit[email]   jpruizmdq@hotmail.com
toEdit[id]  2
toEdit[name]    John
toEdit[surname] Doe
Código fuente
toEdit%5Bid%5D=2&toEdit%5Bname%5D=John&toEdit%5Bsurname%5D=Doe&toEdit%5BdocumentType%5D=DNI&toEdit%5BdocumentNumber%5D=36466&toEdit%5Bemail%5D=jpruizmdq%40hotmail.com

它没有工作,因为你的请求的内容类型是application/x-www-form-urlencoded ,它应该是application/json

尝试使用Jquery以下列方式发送它:

$.ajax({
    type: "POST",
    url: "someurl",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    data: "{id: '" + someId + "'}",
    success: function(json) {

}};

谢谢! 问题解决了。 这是代码

@RequestMapping(value="/editJSON2")
    public @ResponseBody ActionResult editJSON2(@RequestBody CustomerTO toEdit){
        return new ActionResult(toEdit);
    }


ajaxCall('editJSON2.html',JSON.stringify(currentCustomer),function(valor){
            alert('OK');
        });


function ajaxCall(url,data,callback,onError){

    jQuery.ajax({
        url:url
        ,dataType: 'json'
        ,data:data
        ,type: "POST"
        ,contentType: "application/json; charset=utf-8"
        ,success:function(actionResult){
                         -----------
        }
        ,error:function(jqXHR, textStatus, errorThrown){
            ---
        }
    });
}

很简单! 我添加了contentType:“application / json; charset = utf-8”,我使用了JSON.stringify(currentCustomer)。 有了它,它工作

暂无
暂无

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

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