2016-11-03 4 views
0

저는 Spring MVC에 조금 익숙한 데, 하나의 객체와 다른 객체의 배열이라는 두 개의 매개 변수를 전달하는 컨트롤러 메소드 중 하나에 문제가 있습니다. 나는 API 컨트롤러에 데이터를 게시하는 Ajax 호출을 사용하고 있습니다, 그러나 나는 다음과 같은 오류가 객체의 배열마다 시간을 반환받을 : 실패Spring MVC를 사용하여 컨트롤러에 객체 배열 전달하기

는 [[Lcom.name.models.UserAccessListMembers를 인스턴스화; ] : 기본 생성자가 없습니다. 자바 스크립트 여기

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

    <code here> 
} 

된다 : 여기서

컨트롤러 방법이다 : 중첩 예외 java.lang.NoSuchMethodException이다

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 배경에서 내가 무엇을 잘못하고 있는지 또는 조각을 놓치고 있는지 잘 모르겠습니다.

스프링 MVC로 클래스를 올바르게 맵핑하고 인스턴스화하는 방법을 알 수있는 사람이 있습니까? MVC Controller에 객체를 보내기위한 java의 모범 사례는 무엇입니까?

+0

이 매개 변수에'@ RequestParam' 또는'@ RequestBody'가 필요하지 않습니까? –

+0

행운과 함께 RequestParam 시도하고 그냥 RequestBody 시도한 "콘텐츠 형식이 지원되지 않습니다 - urlformencoded ..."오류를 throw합니다. – Encryption

+0

아, 아마도 두 개의 json 매개 변수가 있기 때문에 단일 클래스 및 요청 본문 주석을 사용합니다. –

답변

0

당신이 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 목록에서 인터페이스이며 인스턴스화 할 수 없습니다. 그래서 나는 그것을 Controller 메소드에서 사용할 수 없을 것이다. 나는 Arg없는 생성자를 가지고있다. 마지막으로 Spring MVC에 삽입 된 Jackson은 무엇입니까? 왜냐하면 JSON은 Googel Gson 패키지를 사용하기 때문입니다. – Encryption

+0

죄송합니다. 제가 대답을 잘못하였습니다. 클래스 패스에 잭슨이 없습니다. –

+0

클래스 경로에 Jackson을 추가했지만 여전히 작동하지 않습니다. – Encryption

0

당신은 UserAccessListMembersArray라는 별도의 클래스를 만들고 그 클래스의 필드 List<UserAccessListMembers> members;를 만들고 컨트롤러 메소드의 인수로 새로운 클래스를 사용

는 다음을 사용할 수있는 테스트합니다. 행운을 빕니다.

관련 문제