2013-08-31 37 views
8

Xin chào Tôi bắt đầu với Dịch vụ web vào mùa xuân, vì vậy tôi đang cố gắng phát triển ứng dụng nhỏ trong Spring + JSON + Hibernate. Tôi có một số vấn đề với HTTP-POST. Tôi tạo ra một phương pháp:Bài đăng JSON tới Bộ điều khiển Xuân

@RequestMapping(value="/workers/addNewWorker", method = RequestMethod.POST, produces = "application/json", consumes = "application/json") 
@ResponseBody 
public String addNewWorker(@RequestBody Test test) throws Exception { 
    String name = test.name; 
    return name; 
} 

Và mô hình thử nghiệm của tôi trông giống như:

public class Test implements Serializable { 

private static final long serialVersionUID = -1764970284520387975L; 
public String name; 

public Test() { 
} 
} 

By Postman Tôi gửi đơn giản JSON { "tên": "testName"} và tôi luôn luôn nhận được lỗi;

The server refused this request because the request entity is in a format not supported by the requested resource for the requested method. 

Tôi đã nhập thư viện Jackson. Phương thức GET của tôi hoạt động tốt. Tôi không biết mình đang làm gì sai. Tôi biết ơn vì bất cứ lời đề nghị nào.

+1

Khi bạn gửi yêu cầu bằng POSTMAN, bạn có chỉ định tiêu đề "Loại nội dung: ứng dụng/json" không? –

+0

Ok bây giờ làm việc. Vấn đề của tôi là Content-type.Và câu hỏi thứ hai của tôi. Làm thế nào để làm việc với các quan hệ thực thể trong JSON Spring? Tôi có công nhân thực thể (khi tôi có tham chiếu đến địa chỉ lớp) Và JSON: { "địa chỉ": {"đường phố": "asdas", "homeNo": "123", "flatNo": "123", " mã bưu điện ":" 123 "," thành phố ":" asdas "}," tên ":" asd "," email ":" asd "," pesel ":" 123 "," phone ":" asd "," employmentType ":" asd "," position ":" asd "," desc ":" asd " } Và khi tôi cố gắng ĐĂNG vào đối tượng Công nhân, tôi nhận được lỗi trước đó. Những gì tôi đang làm sai. Cảm ơn bạn đã trả lời cuối cùng. – user2239655

+0

Bạn đã chỉ định "Chấp nhận: ứng dụng/json" trong tiêu đề? –

Trả lời

20

Chuyển đổi đối tượng JSON của bạn để JSON String bằng cách sử

JSON.stringify ({ "tên": "testName"})

hoặc bằng tay. @RequestBody mong đợi chuỗi json thay vì đối tượng json.

Lưu ý: Chức năng stringify có vấn đề với một số phiên bản trình duyệt IE, firefox nó sẽ làm việc

xác minh cú pháp của yêu cầu ajax của bạn cho yêu cầu POST. processData: false tài sản là cần thiết trong yêu cầu ajax

$.ajax({ 
    url:urlName, 
    type:"POST", 
    contentType: "application/json; charset=utf-8", 
    data: jsonString, //Stringified Json Object 
    async: false, //Cross-domain requests and dataType: "jsonp" requests do not support synchronous operation 
    cache: false, //This will force requested pages not to be cached by the browser 
    processData:false, //To avoid making query String instead of JSON 
    success: function(resposeJsonObject){ 
     // Success Action 
    } 
}); 

khiển

@RequestMapping(value = urlPattern , method = RequestMethod.POST) 

public @ResponseBody Test addNewWorker(@RequestBody Test jsonString) { 

    //do business logic 
    return test; 
} 

@RequestBody -Covert Json đối tượng java

@ResponseBody - chuyển đổi đối tượng Java để json

+0

Làm cách nào để covert các đối tượng JSON Array ('[{a: 1}, {a: 2}]') thành java? –

+0

@RequestBody sẽ không chấp nhận List/Array trực tiếp vì bạn cần tạo một lớp bao bọc và thiết lập danh sách cho nó. –

+0

Cấu trúc đối tượng của bạn trông giống như lớp này Kiểm tra { \t id nguyên; Danh sách personList; // getter và setters } JSON: {id: 1, personList: [{a: 1}, {a: 2}]} –

0

Hãy thử sử dụng ứng dụng/* thay thế. Và sử dụng JSON.maybeJson() để kiểm tra cấu trúc dữ liệu trong bộ điều khiển.

0

Đừng quên thêm ge tters và setters đến lớp model của bạn (trong ví dụ lớp Test).

0

Làm điều sau nếu bạn muốn sử dụng json làm yêu cầu và phản hồi http. Vì vậy, chúng ta cần phải thực hiện thay đổi trong [bối cảnh] .xml

<!-- Configure to plugin JSON as request and response in method handler --> 
<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
    <beans:property name="messageConverters"> 
     <beans:list> 
      <beans:ref bean="jsonMessageConverter"/> 
     </beans:list> 
    </beans:property> 
</beans:bean> 
<!-- Configure bean to convert JSON to POJO and vice versa --> 
<beans:bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
</beans:bean> 

MappingJackson2HttpMessageConverter đến messageConverters RequestMappingHandlerAdapter để đá Jackson API trong và chuyển đổi JSON để Java Beans và ngược lại. Bằng cách có cấu hình này, chúng tôi sẽ sử dụng JSON trong phần thân yêu cầu và chúng tôi sẽ nhận dữ liệu JSON trong phản hồi.

Tôi cũng cung cấp đoạn mã nhỏ cho phần điều khiển:

@RequestMapping(value = EmpRestURIConstants.DUMMY_EMP, method = RequestMethod.GET) 

    public @ResponseBody Employee getDummyEmployee() { 
    logger.info("Start getDummyEmployee"); 
    Employee emp = new Employee(); 
    emp.setId(9999); 
    emp.setName("Dummy"); 
    emp.setCreatedDate(new Date()); 
    empData.put(9999, emp); 
    return emp; 
} 

Vì vậy, trong đối tượng đang emp trên sẽ trực tiếp chuyển đổi thành json như một phản ứng. tương tự cũng sẽ xảy ra cho bài đăng.

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