2012-10-20 2 views
1

나는 관련된 질문을보고 도움을받지 못한 사람을 시도했습니다. 나는이 같은 jQuery로 POST의 requst을 보내고있다 :봄 MVC 컨트롤러에 배열을 보내려고 할 때 "잘못된 요청"

var data = {};   
      //this works every time and it's not issue 
      var statusArray = $("#status").val().split(','); 
      var testvalue = $("#test").val(); 

        data.test = testvalue; 
      data.status = statusArray ; 

      $.post("<c:url value="${webappRoot}/save" />", data, function() { 
     }) 

컨트롤러 측면에서 나는 다음 시도했다 : 이들의

public void saveStatus(ModelMap model, Principal principal, HttpSession session, final HttpServletResponse response, @RequestParam String test, @RequestBody String [] status) { 

     //I never get to this point, but when I set statusArray to required false test variable is being populated correctly 
     } 


public void saveStatus(ModelMap model, Principal principal, HttpSession session, final HttpServletResponse response, @RequestParam String test, @RequestParam String [] status) { 

     //I never get to this point, but when I set statusArray to required false test variable is being populated correctly 
     } 



public void saveStatus(ModelMap model, Principal principal, HttpSession session, final HttpServletResponse response, @RequestParam String test, @RequestParam("status") String [] status) { 

     //I never get to this point, but when I set statusArray to required false test variable is being populated correctly 
     } 


public void saveStatus(ModelMap model, Principal principal, HttpSession session, final HttpServletResponse response, @RequestParam String test, @RequestParam(name="status") String [] status) { 

     //I never get to this point, but when I set statusArray to required false test variable is being populated correctly 
     } 

아무도 내가 잘못 뭘하는지 궁금하네요 일했다, 내가 무엇을하든간에 Bad request

+0

당신은 이미 겪었 링크의 종류를 게시 할 수 있을까요? – askmish

답변

1

상태 매개 변수는 @RequestParam(value = "status[]") String[] status (봄 3.1)이어야합니다.

0

실제로 매개 변수를 여러 번 보내야하는 배열로 보내는 것이 문제라고 생각합니다. ? GET 작업 뭔가 등의 경우

: 상태 = FOO & 상태 = BAR

나는 봄이 자동적으로 당신을 위해 배열에 쉼표로 구분 된 문자열을 변환 할 수 없습니다 확신합니다. 그러나 PropertyEditor (PropertyEditorSupport 참조)를 추가하여 문자열을 쉼표로 분리 할 수는 있습니다.

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    binder.registerCustomEditor(String[].class, new PropertyEditorSupport() { 
     @Override 
     public String getAsText() { 
      String value[] = (String[]) getValue(); 
      if (value == null) { 
       return ""; 
      } 
      else { 
       return StringUtils.join(value, ","); 
      } 
     } 

     @Override 
     public void setAsText(String text) throws IllegalArgumentException { 
      if (text == null || text.trim().length() == 0) { 
       setValue(null); 
      } 
      else { 
       setValue(StrTokenizer.getCSVInstance(text).getTokenArray()); 
      } 
     } 

    }); 
} 

참고, 내가 가입 모두 평민 - 랭를 사용하여 문자열을 분할,하지만 당신은 그냥 당신이 원하는 의미 사용하여 자신을 쉽게 할 수 있어요.

일단 이렇게하면, 단일 문자열에서 String []에 바인딩 된 매개 변수를 원할 때마다 spring이 자동으로 변환합니다.

1

나는 또한 과 같은 문제를 겪었습니다. 잘못된 요청. 다음 코드를 수행하여이 문제를 해결했습니다.
JSON.stringify (배열)으로 json 문자열로 변환하여 컨트롤러에 배열을 게시 할 수 있습니다.
푸시()을 사용하여 다중 객체를 배열에 밀어 넣었습니다.

var a = []; 
    for(var i = 1; i<10; i++){ 
     var obj = new Object(); 
     obj.name = $("#firstName_"+i).val(); 
     obj.surname = $("#lastName_"+i).val(); 
     a.push(obj); 
    } 

    var myarray = JSON.stringify(a); 
    $.post("/ems-web/saveCust/savecustomers",{myarray : myarray},function(e) { 

    }, "json"); 

컨트롤러 :
당신은 JSON 문자열을 처리 잭슨을 사용할 수 있습니다.
Jackson은 고성능 JSON 프로세서 Java 라이브러리입니다.

@RequestMapping(value = "/savecustomers", method = RequestMethod.POST) 
    public ServiceResponse<String> saveCustomers(ModelMap model, @RequestParam String myarray) { 

     try{ 
      ObjectMapper objectMapper = new ObjectMapper().configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); 
      List<DtoToMAP> parsedCustomerList = objectMapper.readValue(myarray, new TypeReference<List<DtoToMAP>>() { }); 
      System.out.println(" parsedCustomerList :: " + parsedCustomerList); 
     }catch (Exception e) { 
      System.out.println(e); 
     } 
    } 

참고 : dto에 배열 객체로 게시 할 때와 동일한 변수 이름을 포함해야합니다.
필자의 경우, 내 dto에는 firstName, lastName이 배열 객체로 게시됩니다.

잭슨 의존성은 :

<dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-core-asl</artifactId> 
     <version>1.9.3</version> 
    </dependency> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.9.3</version> 
    </dependency> 
관련 문제