2015-04-08 2 views
0

Я хочу сохранить некоторые данные из HTML-формы (работающей с AngularJS) в мою базу данных, используя Spring. Для этого я использую аннотацию @RequestBody с POJO, но я не могу заставить ее работать: мой POJO не создан, но похоже, что атрибуты POJO не сопоставляются с моими значениями формы (они все равны нулю).RequestBody POJO всегда пусто

Контроллер:

@RequestMapping(value = "/createEntities", method = RequestMethod.POST) 
@ResponseBody 
public List<Entity> createEntities(@RequestBody final EntityList resource, @RequestParam final String kind) { 
    System.out.println("Creating entity for: " + kind); 
    Preconditions.checkNotNull(resource); 
    List<Entity> newEntities = new ArrayList<Entity>(); 
    System.out.println("Entity test = " + resource.getTest()); // Prints "Entity test = null" 
    // Code below returns NullException 
    //System.out.println("Entity list nb = " + resource.getEntity().size()); 
    if (resource.getEntities() != null && !resource.getEntities().isEmpty()) { 
     System.out.println("Entity list is OK"); 
     for (EntityForm eForm : resource.getEntities()) { 
      if (eForm.getGrant() != null) { 
       Entity ent = new Entity(); 
       if ("RTS".equals(kind)) { 
        ent.setDept(deptService.findByAbr(DeptEnum.RTS.name())); 
       } else { 
        ent.setDept(deptService.findByAbr(DeptEnum.RTB.name())); 
       } 
       ent.setGrant(eForm.getGrant()); 
       ent.setCountry(eForm.getCountry()); 
       ent.setName(eForm.getName()); 
       ent = service.create(ent); 
       newEntities.add(ent); 
      } 
     } 
    } 
    return newEntities; 
} 

EntityList является POJO для моей формы. Этот POJO содержит список EntityForm (+ строка для целей тестирования), которая является DTO для моего объекта базы данных Entity.

EntityList POJO:

public class EntityList implements Serializable { 
    private static final long serialVersionUID = 6335318686899794229L; 
    private List<EntityForm> entities; 
    private String test; 

    public EntityList() { 
     super(); 
    } 

    public EntityList(List<EntityForm> entities, String test) { 
     super(); 
     this.entities = entities; 
     this.test = test; 
    } 

    public List<EntityForm> getEntities() { 
     return entities; 
    } 

    public void setEntities(List<EntityForm> entities) { 
     this.entities = entities; 
    } 

    public String getTest() { 
     return test; 
    } 

    public void setTest(String test) { 
     this.test = test; 
    } 
} 

Я думал, что проблема возникла из плохого отображения между моим списком лиц в моей форме и мой List<EntityForm> в моем POJO, поэтому я добавил простую строку в мою POJO ,

AngularJS боковые

Услуги:

app.factory("Entities", function($resource) { 
    return $resource("api/auth/entities", null, 
    { 
     createEntities: {method:'POST', url: "api/auth/entities/createEntities", params: { kind: '@kind' }, isArray:true} 
    }); 
}) 

Контроллер:

$scope.EntForm = {}; 
$scope.EntForm.entities = []; 
$scope.EntForm.test = "myTest"; 

/* ... */ 

$scope.saveEnt= function() { 
    console.log($scope.EntForm); 
    Entities.createEntities($scope.EntForm,{kind:"RTS"},function(res) { 
     var msg = 'Entities created...'; 
     ngToast.create(msg); 
     $location.path("/entities"); 
    }); 
} 

В моей консоли Firefox, я вижу, что $scope.EntForm правильно установить (я все мое существо объекты с установленные поля, а также тестовую строку, определенную в контроллере).

Результат

Все это код будет отображаться:

Creating entity for: RTS 
Entity test = null 

Что я делаю неправильно?

ответ

0

мне пришлось удалить @RequestParam final String kind часть из моего Спринг контроллера, а также параметров в AngularJS коде. Чтобы получить вид, я просто добавил $scope.EntForm.kind = "theValueIWant" в свой контроллер AngularJS.

Я не знаю, если это хороший способ заставить его работать с точки зрения хорошей практики, но я получаю контент @RequestBody.

0

Вы проверили полезную нагрузку POST с помощью инструментов разработчика Firefox, работает ли ваш обычай createEntities?

(добавил бы это в качестве комментария, но, к сожалению, у меня пока не хватает репутации для этого.)

+0

Если вы говорите о отправке моего собственного запроса POST без использования метода AngularJS 'createEntities', я не могу. Существуют требования к аутентификации (я не знаю, как это работает, так как я не кодировал эту часть приложения, поэтому я не могу просто отключить его), каждый запрос GET/POST терпит неудачу, если я попытаюсь отправить его через Инструменты Firefox dev. Есть ли другой способ проверить, работает ли мой метод? – Carrm

+0

@Chugrothas Я хотел проверить фактическое содержимое запроса POST, которое генерирует ваше приложение AngularJS.Я не использовал Firefox некоторое время для разработки и даже не устанавливал его на моем текущем компьютере, поэтому сам не могу его проверить, но с помощью [Web Console] (https: //developer.mozilla. org/en-US/docs/Tools/Web_Console), вы должны иметь возможность отслеживать, например, сделанные сетевые запросы. Затем вы должны убедиться, что ваше приложение AngularJS правильно заполняет содержимое POST. – jmustonen

+0

О да, извините, я полностью забыл о существовании сетевого зрителя в консоли Firefox. Я проверил, и отправленный запрос POST имеет правильные параметры (я могу видеть мои сущности и строку «test»). – Carrm

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