2011-09-07 28 views
14

Tôi gặp sự cố khi cố gắng thiết lập @ResponseBody để trả lại bộ sưu tập. Tôi có JAXB lọ trong classpath và tôi đã không thiết lập bất kỳ ContentNegotiatingViewResolver.Spring MVC @ResponseBody trả về Bản đồ sản xuất "Lỗi 406 KHÔNG CHẤP NHẬN"

Đây là đối tượng đơn giản của tôi: -

@XmlRootElement(name = "test-object") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class TestObject implements Serializable { 

    @XmlAttribute 
    private int id; 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 
} 

Tôi đã viết một bài kiểm tra đơn giản mà trả về một đối tượng duy nhất ... làm việc này mà không có vấn đề, và tôi có thể nhìn thấy XML được tạo ra: -

@RequestMapping(value = "one", method = RequestMethod.GET) 
public @ResponseBody TestObject getSingleObject() { 
    TestObject obj = new TestObject(); 
    obj.setId(1); 

    return obj; 
} 

Điều tôi thực sự muốn là trả về danh sách các đối tượng. Sau khi đọc lại, nó có vẻ như cách làm như vậy là đặt danh sách trong một bản đồ và trở về bản đồ: -

@RequestMapping(value = "all", method = RequestMethod.GET) 
public @ResponseBody Map<String, ? extends Object> getAllObjects() { 
    TestObject obj1 = new TestObject(); 
    obj1.setId(1); 

    TestObject obj2 = new TestObject(); 
    obj2.setId(2); 

    List<TestObject> list = Arrays.asList(obj1, obj2); 

    return Collections.singletonMap("all-objects", list); 
} 

Khi tôi thực hiện ở trên, tôi nhận được "Lỗi 406 Not Acceptable".

Tôi đã làm gì sai ở đây? Tôi đang chạy trên Jetty 6.1 nếu điều đó tạo nên sự khác biệt.

Cảm ơn.

+1

có bất kỳ giải pháp nào ở đây hoạt động không? – Ram

Trả lời

0

Thêm đề xuất hơn câu trả lời nhưng bạn đã cố gắng tạo bản đồ rồi thêm đối tượng và sau đó chỉ cần trả lại bản đồ như thế này?

@RequestMapping(value = "all", method = RequestMethod.GET) 
public @ResponseBody Map<String, ? extends Object> getAllObjects() { 
    TestObject obj1 = new TestObject(); 
    obj1.setId(1); 

    TestObject obj2 = new TestObject(); 
    obj2.setId(2); 

    List<TestObject> list = Arrays.asList(obj1, obj2); 
    Map<String, Object> map = new TreeMap<String, Object>(); 
    map.put("all-objects",list); 
    return map; 
} 
+0

Không làm việc cho tôi. – limc

10

Bạn cần thêm hai phụ thuộc này vào tệp pom.xml!

<dependency> 
    <groupId>org.codehaus.jackson</groupId> 
    <artifactId>jackson-core-lgpl</artifactId> 
    <version>1.8.1</version> 
</dependency> 

<dependency> 
    <groupId>org.codehaus.jackson</groupId> 
    <artifactId>jackson-mapper-lgpl</artifactId> 
    <version>1.8.1</version> 
</dependency> 
5

tôi đã cùng một vấn đề và sau một vài giờ gỡ lỗi cuối cùng tôi đã tìm thấy giải pháp. Chỉ trong trường hợp người khác bị mắc kẹt với cùng một vấn đề, đây là những gì tôi tìm thấy.

Bạn có thể theo dõi Ajax Simplifications in Spring 3 để thông báo cho bạn sử dụng phần tử cấu hình mvc: chú thích theo hướng chú thích.

Những gì nó không nói với bạn là mvc: chú thích điều khiển chỉ là một phím tắt để xác định một vài hạt tiêu chuẩn, trừ khi bạn đã có một trong những hạt được xác định!

Với mvc: cấu hình hướng chú thích, MappingJacksonHttpMessageConverter được đăng ký dưới dạng một MessageConverter trên org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.

Nếu bạn đã xác định AnnotationMethodHandlerAdapter của riêng mình, bạn cũng nên xác định thủ công MappingJacksonHttpMessageConverter này.

Cfr Custom message converters registered with AnnotationMethodHandlerAdapter are not used, only the default ones are used. thảo luận về vấn đề tương tự. Ngoài ra kiểm tra SPR-6524 và SPR-6306, không thể đăng các liên kết do ngăn chặn spam :(

Phần liên quan trong cấu hình mùa xuân của tôi đã kết thúc như thế này:

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
     <property name="webBindingInitializer"> 
      <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> 
       <property name="validator"> 
        <bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 
        </bean> 
       </property> 
      </bean> 
     </property> 
     <property name="messageConverters"> 
      <list> 
       <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.StringHttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.feed.AtomFeedHttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.feed.RssChannelHttpMessageConverter"/> 
      </list> 
     </property> 
</bean> 
2

Tôi biết câu hỏi này là một chút cũ, nhưng tôi đã có cùng một vấn đề

tôi đã giải quyết thêm để xây dựng con đường hai lọ:.. jackson-core-asl-1.x.jarjackson-mapper-asl-1.x.jar bạn có thể tải chúng từ đây: http://wiki.fasterxml.com/JacksonDownload hoặc nếu bạn sử dụng Maven bạn có thể thêm chúng như phụ thuộc projet.

Lưu ý rằng tôi đã sử dụng phiên bản 1.x (1,9, trong trường hợp của tôi) và không phải là 2.x. Phiên bản cuối cùng không hiệu quả với tôi.

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