2014-12-24 3 views
0

У меня есть HTML-форма, в которой есть «вложенный» объект. Если я отправляю enitty только с чистыми атрибутами, без других объектов внутри, это нормально, но для отправки формы контроллеру REST с использованием ajax исключение генерируется не контроллером, связанным с событием, потому что этот «вложенный» объект не переименовывается как атрибут отправленного основного объекта, который равен Product.Отправка вложенного объекта контроллеру REST

я могу есть данные в двух differentes jquery путей в операции АЯКС:

$.param($('form').serializeArray()) 
"id=&type.id=1&name=One" 

и

JSON.stringify($('form').serializeArray()) 
"[{"name":"id","value":""},{"name":"type.id","value":"1"},{"name":"name","value":"One"}]" 

И в этом последнем случае, конечно, я могу создать $.eachjquery функцию для преобразования полностью объект. Но есть ли способ легко преобразовать его, используя jquery ou хорошо сконфигурированный объект-манипулятор Jackson?

Здесь представлены форма, вызов ajax, объекты Java и контроллер.

Форма:

<form> 
    <input type="hidden" name="id"/> 
    <select id="type.id"> 
    <option value='1'>One</option> 
    <!-- ... --> 
    </select> 
    <input type="text" id="name"/> 
</form> 

Сущности:

@Entity 
@Table 
public class Product { 
    @Id 
    @GeneratedValue 
    private Integer id; 
    @ManyToOne 
    private Type type; 
    @Column(nullable = false, length = 250) 
    private String name; 

    /* getters and setters */ 
} 

@Table 
@Entity 
public class Type { 
    @Id 
    @GeneratedValue 
    @Column(length = 5) 
    private Integer id; 
    @Column(length = 50, nullable = false) 
    private String name; 

    /* getters and setters */ 
} 

Ajax, представленные в какой-то кнопки:

$.ajax({ 
     type : "POST", 
     url : "create", 
     contentType : "application/json; charset=utf-8", 
     dataType : "json", 
     data : /* 
       here stands the doubt. How serialize my form? 
       */, 
     success : function(data) { 
      if (data === true) { 
       alert('Success!'); 
      } else { 
       console.log('Some error'); 
      } 
     } 
    }); 

Контроллер:

@RequestMapping(value = "/create", method = RequestMethod.POST) 
@ResponseBody 
public Boolean create(@RequestBody Domain model) throws Exception { 
    try { 
     getService().create(model); 
     return true; 
    } catch (Exception e) { 
     return false; 
    } 
} 

ответ

-1

Вы можете попробовать это:

Контроллер:

@RequestMapping(value = "/create", method = RequestMethod.POST , headers = "Accept=application/json") 
@ResponseBody 
public Map<String, String> create(@RequestBody Domain model) throws Exception { 
    HashMap<String, String> result = new HashMap<String, String>(); 
    try { 
     getService().create(model); 
     result.put("status",true); 
    } catch (Exception e) { 
     result.put("status",false); 
    } 
    return result; 
} 

Аякса представлен в какой-то кнопки:

$.ajax({ 
     type : "POST", 
     url : "create", 
     contentType : "application/json; charset=utf-8", 
     dataType : "json", 
     data : /* 
       here stands the doubt. How serialize my form? 
       */, 
     success : function(data) { 
      if (data.status === true) { 
       alert('Success!'); 
      } else { 
       console.log('Some error'); 
      } 
     } 
    }); 
+0

Спасибо, что попробовали помочь, Стивен. Но главный вопрос: как сериализовать форму? – Moesio

1

К сожалению, я просто неправильно понял ваш вопрос. Это еще одно решение, которое дает селектор формы и возвращает объект json.

function serializeForm(formSelector){ 
    var params = $.param($(formSelector).serializeArray()); 
    var jsonStr = '{"'+params.replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g,'":"')+'"}'; 
    var jsonObj = JSON.parse(jsonStr); 
    return jsonObj; 
} 

var formJsonData = serializeForm('form'); 
+0

Но если основной объект имеет другой объект как поле основного объекта, как в моем примере вопроса «type.id». Объект mapper не может найти «type.id» как поле «Продукт» и выдает исключение. Это главная проблема. – Moesio

0

Это еще один сериализатор объектов.

$.fn.serializeObject = function() 
{ 
    var o = {}; 
    var a = this.serializeArray(); 
    $.each(a, function() { 
     if (o[this.name] !== undefined) { 
      if (!o[this.name].push) { 
       o[this.name] = [o[this.name]]; 
      } 
      o[this.name].push(this.value || ''); 
     } else { 
      o[this.name] = this.value || ''; 
     } 
    }); 
    return o; 
}; 
+0

Я просто пробовал это, @Ghokun, но, как я сказал в комментарии в другом ответе: Если у главного объекта есть другой объект как поле основного объекта, как в моем примере вопроса «type.id». Объект mapper не может найти «type.id» как поле «Продукт» и выдает исключение. Это главная проблема. – Moesio

Смежные вопросы