2013-01-08 25 views
8

Tôi đang làm việc với Spring MVC bằng cách sử dụng các đối tượng JSON. trong khi tôi đang tìm cách gửi đối tượng JSON từ RESTClient, tôi nhận đượcYêu cầu được gửi bởi máy khách là cú pháp không chính xác(). + Spring, RESTClient

Trạng thái HTTP 400 - Yêu cầu do khách hàng gửi sai cú pháp().

Đây là bộ điều khiển của tôi

ObjectMapper mapper=new ObjectMapper(); 
@RequestMapping(value = "/addTask", method = RequestMethod.GET) 
     public ModelAndView addTask(@RequestParam("json") String json) throws JsonParseException, JsonMappingException, IOException 
     { 
      System.out.println("Json object from REST : "+json); 
      Task task=(Task) mapper.readValue(json, Task); 
      service.addService(task); 
      return new ModelAndView("Result"); 
     } 

URL yêu cầu của tôi: http://localhost:8080/Prime/addTask

My Json Object:

{ "taskname": "không có gì", "taskID": 1234 , "taskDesc": "nothing doing"}

Ngoài ra tôi đã cố gắng xác định "Content-Type: application/json" trong RESTClient nhưng vẫn nhận được các lỗi tương tự

+1

Tôi không chắc chắn về cách Spring hoạt động nhưng nếu phương thức yêu cầu của bạn là 'GET' bạn không nên yêu cầu URL là' http: // localhost: 8080/Prime/addTask? Json =% 7B% 22taskName% 22% 3A % 22nothing% 22% 2C% 22taskId% 22% 3A1234% 2C% 22taskDesc% 22% 3A% 22nothing% 20doing% 22% 7D' với tham số 'json' được gửi trong chuỗi truy vấn? –

+0

Tôi cũng đã thử bằng cách thêm chuỗi json để yêu cầu URL nhưng vẫn cho biết lỗi tương tự. – Chandrasekar

+0

Bạn có thể sử dụng một công cụ như 'Fiddler' (http://www.fiddler2.com/fiddler2/version.asp) để kiểm tra yêu cầu. Cũng đăng nó trong câu hỏi để những người khác có thể có một cái nhìn vào nó. –

Trả lời

2

Hãy thử

Thay đổi này

@RequestParam("json") String json 

Để

@RequestBody Task task 

Nếu bạn không quan tâm đến phương thức POST, bạn có thể thử này

c Hange phương pháp điều khiển của bạn từ

@RequestMapping(value = "/addTask", method = RequestMethod.GET) 
    public ModelAndView addTask(@RequestParam("json") String json) 

để

@RequestMapping(value = "/addTask/{taskName}/{taskId}/{taskDesc}", method = RequestMethod.GET) 
    public ModelAndView addTask(@RequestParam("taskName") String taskName, 
@RequestParam("taskId") String taskId,@RequestParam("taskDesc") String taskDesc) 

và thay đổi URL của bạn để

http://localhost:8080/Prime/addTask/mytask/233/testDesc 
+0

Cảm ơn bạn đã trả lời. Tôi đã thử nhưng không sử dụng. Ngoài ra @RequestBody là cho phương thức POST. Tôi đang sử dụng phương thức GET – Chandrasekar

+0

@Chandrasekar Tôi không nghĩ rằng bạn có thể gửi đối tượng trong phương thức get – Kris

+0

Cảm ơn bạn ... nó đã làm việc cho tôi .... – Chandrasekar

16

tôi chạy vào một tình huống tương tự sử dụng một chuỗi JSON trong cơ thể yêu cầu thời gian gần đây, và sử dụng một thiết lập Spring tương tự như của bạn. Trong trường hợp của tôi, tôi đã không được xác định một tham số String và deserialising nó bản thân mình, mặc dù tôi đã để cho mùa xuân làm điều đó:

@RequestMapping(value = "/myService/{id}", method = RequestMethod.POST) 
    @ResponseBody 
    public void myService(@PathVariable(value = "id") Long id, @RequestBody MyJsonValueObject request) { 
    .. 
    } 

Tôi đã nhận được một lỗi HTTP 400 "Yêu cầu gửi của khách hàng là không chính xác cú pháp" phản ứng . Cho đến khi tôi nhận ra rằng không có một nhà xây dựng mặc định trên @RequestBody MyJsonValueObject vì vậy đã có vấn đề deserialising nó. Vấn đề đó được trình bày theo cách này.

Vì vậy, nếu bạn đang sử dụng POST và các đối tượng, và nhận được lỗi như thế này, đảm bảo rằng bạn có một hàm tạo mặc định! Thêm một số JUnit để chắc chắn bạn có thể deserialise đối tượng đó.

Lưu ý: Tôi không nói đây là lý do duy nhất khiến bạn gặp lỗi này. Các trường hợp ban đầu được sử dụng chỉ String (mà không có một constructor mặc định!) Vì vậy, nó là một chút khác nhau. Nhưng trong cả hai trường hợp, nó xuất hiện URI yêu cầu dường như đã được ánh xạ tới đúng phương thức, và đã xảy ra lỗi khi cố gắng trích xuất các tham số từ yêu cầu HTTP.

+0

Đó là nó trong trường hợp của tôi. Cảm ơn. – korro

+0

Cũng đã lưu trường hợp của tôi. Cảm ơn!! –

+0

Tại sao chúng ta phải có hàm tạo mặc định với POST? – Xelian

0

Vấn đề của tôi là do ánh xạ không chính xác đối tượng @RequestBody.

Request Body của tôi trông như thế này

{data: ["1","2","3"]} 

Tôi có đoạn mã sau vào bộ điều khiển của tôi

@RequestMapping(value = "/mentee", method = RequestMethod.POST) 
public @ResponseBody boolean updateData(@RequestBody List<Integer> objDTO, HttpSession session) { 
     ... 
    } 

này cho tôi HTTP 400 vì mùa xuân không biết làm thế nào để ràng buộc dữ liệu JSON của tôi để một danh sách.

Tôi đã thay đổi đối tượng RequestBody như sau

@RequestMapping(value = "/mentee", method = RequestMethod.POST) 
public @ResponseBody boolean updateData(@RequestBody ObjectiveDto objDTO, HttpSession session) { 
     ... 
    } 

và xác định ObjectiveDto như sau

@ToString 
public class ObjectiveDto { 

    @Getter @Setter 
    private List<Integer> data; 

} 

này giải quyết các HTTP 400 lỗi.

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