2016-11-03 2 views
0

Я немного новичок в Spring MVC, и у меня возникают проблемы с одним из моих методов контроллера, где я передаю два параметра: один объект и другой массив объектов. Я использую вызов Ajax, чтобы отправить данные в контроллер API, но я получаю следующее сообщение об ошибке возвращается каждый раз, когда для массива объектов:Передача массива объектов контроллеру с помощью Spring MVC

Не удалось создать экземпляр [[Lcom.name.models.UserAccessListMembers; ]: Конструктор по умолчанию не найден; вложенное исключение java.lang.NoSuchMethodException:

Вот метод управления:

@ResponseBody 
@RequestMapping(value = "/api/user/save/accesslist", method = RequestMethod.POST) 
public String saveAccessList(UserAccessLists list, UserAccessListMembers[] members){ 

    <code here> 
} 

Вот это JavaScript:

var newEntries = []; 
     var newEntry = {"id" : null, "listId" : 1, "wwid" : "abc123" }; 
     newEntries.push(newEntry); 
     var theList = {"id": 1, "userId" : null, "name": "new list" }; 
     $.ajax({ 
      method: "POST", 
      url: window.contextPath + '/api/user/save/accesslist', 
      data: {list : theList, members : newEntries }, 
      async: false, 
      cache: false, 
      success: function() { 
        <do stuff> 
      }, 
      error: function (xhr, textStatus, errorThrown) { 
       console.log("xhr: ", xhr); 
      } 
     }); 

И, наконец, вот это класс UserAccessListMembers:

public class UserAccessListMembers implements java.io.Serializable { 

private Integer id; 
private Integer listId; 
private String wwid; 
private String personName; 

public UserAccessListMembers() { 
} 

public UserAccessListMembers(Integer id, Integer listId, String wwid) { 
    this.id = id; 
    this.listId = listId; 
    this.wwid = wwid; 
} 
    < getters and setters below here > 
} 

Вы можете видеть, что у меня есть два конструктора класса UserAccessListMembers, конструктор по умолчанию и один, который включает в себя все необходимые свойства. Я не уверен, что я делаю неправильно, или если мне не хватает части, поскольку я родом из фона .NET MVC.

Может ли кто-нибудь помочь мне выяснить, как получить Spring MVC для правильной карты и создания экземпляра класса? Каковы некоторые из лучших практик в java здесь для отправки объектов в MVC-контроллер?

+0

Нам не нужны '@ RequestParam' или' @ RequestBody' для этих параметров? –

+0

Я попробовал RequestParam без везения и просто попробовал RequestBody, он выдает сообщение об ошибке «Тип контента не поддерживается - urlformencoded ...» – Encryption

+0

А, может быть, потому, что у вас есть два параметра json, попробуйте обернуть их в один класс и аннотации тела запроса запроса. –

ответ

0

Предполагая, что вы используете Maven добавить что-то вроде следующего, чтобы вы POM так Джексон находится в пути к классам:

<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> 

Пока вы передаете правильный JSON в контроллер будет десериализации его.

Для проверки вы можете использовать следующее:

public class JacksonTest { 
    @Test 
    public void test1() throws IOException { 
     String test = "[{\"id\" : null, \"listId\" : 1, \"wwid\" : \"abc123\"}]"; 
     UserAccessListMembers[] userAccessListMemberses = new ObjectMapper().readValue(test, UserAccessListMembers[].class); 
     for (UserAccessListMembers members : userAccessListMemberses) { 
      System.out.println(members); 
     } 
    } 
} 
+0

В Java List есть интерфейс и не может быть создан. Поэтому я не смог бы использовать его в методе Controller. У меня есть конструктор No-Arg. Наконец, Джексон встроен в Spring MVC? Потому что для чего-то JSON мы используем пакет Googel Gson. – Encryption

+0

Извините, что плохой ответ, я обновил, я думаю, что вам не хватает Джексона в вашем пути к классу. –

+0

Я добавил Джексона в путь класса, но он все еще не работает. – Encryption

0

Вы можете создать отдельный класс с именем UserAccessListMembersArray и в этом классе создать поле List<UserAccessListMembers> members; и использовать новый класс в качестве аргумента вашего метода контроллера. Удачи.

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