2012-10-24 26 views
13

Tôi đang chạy một ứng dụng Spring 3.1.2. Tôi có một servlet RESTful với một số phương thức. Các phương thức GET đang làm việc tuyệt vời (kết hợp @PathVariables, các câu trả lời chính xác được trộn lẫn với JSON hoặc XML dựa trên tiêu đề Chấp nhận, v.v.) 100% thời gian.Mùa xuân không chấp nhận thông số POST trừ khi @RequestParam "required = false"

Tuy nhiên, phương thức POST chỉ đơn giản là không hoạt động. Sau nhiều giờ lộn xộn xung quanh với chuyển đổi và mọi khía cạnh mùa xuân khác tôi có thể tìm thấy (tất cả các tinkering trở lại), tôi thu hẹp nó làm vào lĩnh vực required trong @RequestParam. Đây là một phương pháp thử nghiệm đơn giản tôi đã sử dụng để điều tra:

@RequestMapping (value = "/bogus", 
       method = POST) 
public @ResponseBody PassResponse bogus (
      @RequestParam (value = "test", required = false) String test) { 
    // Just some handy garbage objects that marshal to JSON/XML 
    UserResponse user = new UserResponse(); 
    user.setName (test); 
    AccountDetail detail = new AccountDetail (user,null); 
    return new PassResponse (detail); 
} 

cần = false: mọi thứ hoạt động (thông số được nhận và giải thích). Đúng như tôi mong đợi nó để làm việc

cần = true: (hoặc không quy định, vì đây là mặc định) Tôi liên tục nhận được thông báo "MissingServletRequestParameterException: chuỗi bắt buộc tham số 'test' không có mặt"

khách hàng xem bên:

cần = true

Request URL:http://localhost:8080/internal-project/rest/bogus 
Request Method:POST 
Status Code:400 Bad Request 
Request Headersview source 
Accept:application/json 
Connection:keep-alive 
Content-Length:12 
Host:localhost:8080 
Request Payload 
test=LALALAA 
Response Headersview source 
Connection:close 
Content-Length:971 
Content-Type:text/html;charset=utf-8 
Date:Wed, 24 Oct 2012 18:41:05 GMT 
Server:Apache-Coyote/1.1 

cần = false

Request URL:http://localhost:8080/internal-project/rest/bogus 
Request Method:POST 
Status Code:200 OK 
Request Headersview source 
Accept:application/json 
Connection:keep-alive 
Content-Length:12 
Host:localhost:8080 
Request Payload 
test=LALALAA 
Response Headersview source 
Content-Type:application/json;charset=UTF-8 
Date:Wed, 24 Oct 2012 18:44:03 GMT 
Server:Apache-Coyote/1.1 
Transfer-Encoding:chunked 

Đó là chính xác cùng thử nghiệm bộ được chạy khi Toggling required và tôi có thể nhìn thấy các thông số đã được thông qua. Khi tham số là tùy chọn, Spring xử lý nó một cách chính xác.

Nếu có ai đó vượt qua điều này trước hoặc có bất kỳ ý tưởng nào tôi muốn nghe họ. Đánh dấu tham số được yêu cầu là tùy chọn, ngay cả khi nó hoạt động, là tài liệu tự khủng khiếp ngay cả khi tôi nhận xét nó. Cộng với hành vi làm tôi hơi lo lắng. Hy vọng rằng tôi vừa vặn gì đó lên một nơi nào đó ...

Trả lời

18

Đầu trang Content-Type của bạn phải là application/x-www-form-urlencoded Tôi nghĩ vậy.

+0

Bạn chính xác! Đặt 'Content-Type' như bạn đã đề xuất đã làm trong thực tế, bình thường hóa hành vi ánh xạ. Tôi không biết tại sao trường 'required' kích hoạt hành vi phân kỳ khi tôi không thiết lập được điều này, nhưng đó là một vấn đề nhỏ hơn. Cảm ơn bạn đã dành thời gian! – node42

Các vấn đề liên quan