2010-03-08 11 views
6

Tôi đang cố tạo một dịch vụ web dựa trên mùa xuân đơn giản hỗ trợ "bài đăng" có nội dung xml.đăng xml lên máy chủ Spring REST trả về Loại phương tiện không được hỗ trợ

Vào mùa xuân, tôi xác định một AnnotationMethodHandler:

<bean id="inboundMessageAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
     <property name="messageConverters"> 
      <util:list> 
       <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter"> 
        <property name="marshaller" ref="xmlMarshaller"/> 
        <property name="unmarshaller" ref="xmlMarshaller"/> 
       </bean> 
      </util:list> 
     </property> 
    </bean> 

Và một jaxb dựa xml marshaller:

<bean id="xmlMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
     <property name="contextPaths"> 
      <array> 
       <value>com.company.schema</value> 
      </array> 
     </property> 
     <property name="schemas"> 
      <array> 
       <value>classpath:core.xsd</value> 
      </array> 
     </property> 
    </bean> 

điều khiển của tôi được chú thích như sau, trong đó "Resource" là một lớp autogenerated bởi jaxb :

@RequestMapping(method = POST, value = "/resource") 
    public Resource createResource(@RequestBody Resource resource) { 
     // do work 
    } 

Kết quả của cuộc gọi webservice luôn là "HTTP/1.1 415 Med không được hỗ trợ ia Type ". Đây là cuộc gọi dịch vụ mẫu:

HttpPost post = new HttpPost(uri); 
post.addHeader("Accept", "application/xml"); 
post.addHeader("Content-Type", "application/xml"); 

StringEntity entity = new StringEntity(request, "UTF-8"); 
entity.setContentType("application/xml"); 
post.setEntity(entity); 

Dường như với tôi rằng tôi đang đặt đúng loại phương tiện ở mọi nơi có thể. Bất cứ ai có một ý tưởng?

Chỉnh sửa: sau khi gỡ lỗi tiếp theo, có vẻ như nó không bao giờ bị lệch như cố gắng loại bỏ đối tượng. Tôi không hoàn toàn hiểu được ma thuật đen đằng sau cách AnnotationMethodHandler biết rằng một cái gì đó của ứng dụng kiểu/xml nên đi đến MarshallingHttpConverter. Có ai có thể làm sáng tỏ điều đó không?

Trả lời

5

Lý do có thể nhất là bối cảnh JAXB không biết cách đối chiếu với đối tượng Resource.

Resource có chú thích @XMLRootElement không? Nếu không, thì Jaxb2Marshaller sẽ không chấp nhận tham số và bạn sẽ gặp lỗi 415. Điều này được thực hiện bởi phái đoàn từ Sprng đến thời gian chạy JAXB, Spring không thực sự có nhiều lời nói trong vấn đề này.

chỉnh sửa: Việc ép buộc thực tế dữ liệu vào tham số @RequestBody được thực hiện trong HandlerMethodInvoker.resolveRequestBody(). Có một số điều kiện phải được đáp ứng trước khi trận đấu được thực hiện, bao gồm kết hợp kiểu MIME và loại lớp tham số, và nếu nó không thành công, không có đăng nhập, chỉ là HTTP 415. Hãy xem nguồn cho phương thức đó và tốt hơn, hãy thực hiện một số gỡ lỗi từ xa để xem vị trí của logic không thành công cho thiết lập của bạn.

+0

Cảm ơn bạn đã đề xuất, skaffman. Tôi kiểm tra và lớp thực sự có thẻ @XMLRootElement. –

+0

@Mayra: Và 'Tài nguyên' nằm trong gói 'com.company.schema'? Hãy thử viết một bài kiểm tra đơn vị để xây dựng một 'Jaxb2Marshaller' với cấu hình của bạn, và đảm bảo' support (Resource.class) 'trả về' true'. Điều đó cần phải làm việc trước khi bạn có thể nhận được thêm bất kỳ. – skaffman

+0

Không có súc sắc, tôi đã tạo một đối tượng Jaxb2Marshaller, đặt contextPath và lược đồ như tôi có trong tệp spring của mình và nó nói nó hỗ trợ lớp của tôi. –