2015-05-13 17 views
6

Tôi có một bộ điều khiển Spring MVC với phương thức sau:Spring MVC restcontroller trở json chuỗi

@RequestMapping(value = "/stringtest", method = RequestMethod.GET) 
public String simpletest() throws Exception { 
    return "test"; 
} 

này nằm bên trong một bộ điều khiển bắt đầu như thế này:

@RestController 
@RequestMapping(value = "/root") 
public class RootController 

Khi tôi gọi các phương thức khác mà trả về các đối tượng, các đối tượng này được Jackson tuần tự hóa thành JSON. Nhưng phương thức này trả về một String không được chuyển thành JSON. Trong trường hợp không rõ ràng, đây là ví dụ sử dụng curl:

$curl http://localhost:8080/clapi/root/stringtest 
test 

Vì vậy, vấn đề "kiểm tra" không có dấu ngoặc kép không phải là chuỗi JSON, nhưng khách hàng REST của tôi đang mong đợi một chuỗi. Tôi mong đợi lệnh curl để hiển thị chuỗi đó với dấu ngoặc kép xung quanh nó để nó hợp pháp JSON thay thế:

"test" 

Tôi đang sử dụng Spring WebMVC 4.1.3 và Jackson 2.4.3. Tôi đã thử thêm thuộc tính "produce" vào RequestMapping để nói nó sẽ trả về JSON. Trong trường hợp này, thuộc tính Content-Type được gửi trở lại là "application/json" nhưng vẫn là chuỗi kiểm tra không được trích dẫn.

tôi có thể workaround này bằng cách gọi một thư viện JSON để chuyển đổi bằng Java String để JSON, nhưng nó có vẻ như Spring MVC và Jackson thường làm điều này tự động. Tuy nhiên bằng cách nào đó họ không làm điều đó trong trường hợp của tôi. Bất kỳ ý tưởng những gì tôi có thể đã cấu hình sai để được nhận chỉ kiểm tra lại thay vì "thử nghiệm"?

+0

Bạn có thể thử gói Chuỗi của bạn trong một Object. Nếu không, không có cách nào cho Jackson để biết tên gì để cung cấp cho phím JSON của String của bạn. – Matt

+0

@ Chạy một chuỗi đơn thuần là JSON hợp lệ, nó không cần phải là một đối tượng. Ví dụ, ngay cả một mảng hoạt động tốt. Nếu tôi thay đổi mã để trả về một mảng, thì tôi nhận được '[" test "]'. Vì vậy, tôi hy vọng nếu tôi trả về một chuỗi đơn giản, tôi sẽ nhận được '" test "' –

+0

Đây không phải là quá rõ ràng, nhìn vào câu trả lời này: http://stackoverflow.com/a/7487892/369946. Theo định nghĩa RFC của kiểu phương tiện "application/json", JSON phải là một đối tượng hoặc một mảng. – Matt

Trả lời

7

Nó chỉ ra rằng khi bạn sử dụng chú thích @EnableWebMvc rằng nó bật một loạt các bộ chuyển đổi thông điệp http theo mặc định. Điều thứ hai trong danh sách là StringHttpMessageConverter mà tài liệu nói sẽ được áp dụng cho text/* loại nội dung. Tuy nhiên, sau khi bước qua với trình gỡ lỗi, nó áp dụng cho đối tượng String cho */* nội dung types- mà rõ ràng bao gồm application/json.

MappingJackson2HttpMessageConverter chịu trách nhiệm về application/json loại nội dung tiếp tục nằm trong danh sách này. Vì vậy, đối với các đối tượng Java khác với String, cái này được gọi. Đó là lý do tại sao nó đã làm việc cho đối tượng và mảng loại, nhưng không STRING- bất chấp những gợi ý tốt của việc sử dụng sản xuất thuộc tính để thiết lập application/json loại nội dung. Mặc dù loại nội dung đó là cần thiết để kích hoạt bộ chuyển đổi này, trình biến đổi String đã nắm bắt được công việc đầu tiên!

Như tôi đã mở rộng lớp WebMvcConfigurationSupport đối với một số cấu hình khác, tôi gạt những phương pháp sau đây để đặt bộ chuyển đổi Jackson đầu tiên vì vậy khi content-type là application/json rồi một này sẽ được sử dụng thay cho công cụ chuyển đổi String:

@Override 
protected void configureMessageConverters(
     List<HttpMessageConverter<?>> converters) { 
    // put the jackson converter to the front of the list so that application/json content-type strings will be treated as JSON 
    converters.add(new MappingJackson2HttpMessageConverter()); 
    // and probably needs a string converter too for text/plain content-type strings to be properly handled 
    converters.add(new StringHttpMessageConverter()); 
} 

Bây giờ khi tôi gọi phương pháp thử từ curl, tôi nhận được kết quả mong muốn "test" thay vì chỉ test, vì vậy ứng dụng góc cạnh đang chờ JSON hiện đang vui vẻ.

0

Hãy thử một cái gì đó như thế này

@RequestMapping(value = "/stringtest", method = RequestMethod.GET, produces="application/json") 
public @ResponseBody String simpletest() throws Exception { 
    return "test"; 
} 
+0

Cảm ơn Martin, tôi đã cố gắng tạo thuộc tính, nhưng như tôi đã đề cập, tất cả những gì dường như làm là thay đổi Content-Type thành "application/json" nhưng đầu ra vẫn là 'test' không có dấu ngoặc kép. Và @ResponseBody không cần thiết vì tôi có chú thích @RestController, điều này làm cho nó tự động. Tuy nhiên, tôi đã cắt giảm đề xuất của bạn trong trường hợp tôi đã sai về điều đó nhưng không may mắn. –

1

Hãy thử điều này:

@RequestMapping(value = "/stringtest", method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE) 
+0

Cảm ơn Shyam, tôi đã thử điều đó nhưng nó chỉ đặt Content-Type thành "application/json" nhưng không quấn chuỗi của tôi trong dấu ngoặc kép. Tôi đã cố gắng cắt và dán đề xuất của bạn trong trường hợp tôi đã gõ sai, nhưng nó không hoạt động. –

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