2011-01-31 32 views
23

Xin lỗi vì đã đăng câu hỏi noob này, nhưng tôi đã gỡ lỗi vấn đề này trong một thời gian ngắn. Tôi đang gặp một vấn đề nhỏ cố gắng để có được những câu trả lời để trả lại XML dựa trên đối tượng: -Spring MVC 3: Trả về XML thông qua @ResponseBody

@RequestMapping(value = "/mylink", method = RequestMethod.GET) 
public @ResponseBody SomeObject doIt() { 
    ... 
} 

Ngay bây giờ, mặc dù API mà được gọi, phía khách hàng của tôi không nhận được phản hồi XML ở tất cả . Tôi đã đọc một vài nơi và có vẻ như tôi cần phải cấu hình trình soạn thảo XML hoặc các bộ giải mã XML, nhưng tôi không chắc chắn làm thế nào để tích hợp phần đó vào cấu hình hiện có của tôi. Tôi hiện đang có cấu hình như sau trong servlet.xml tôi: -

<context:component-scan base-package="ss.controller" /> 

<mvc:annotation-driven /> 

<mvc:resources location="/resources/" mapping="/resources/**" /> 

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/jsp/app/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 

Có thể ai đó vui lòng gửi một số cấu hình mẫu về cách tôi có thể đi về trong việc cấu hình servlet.xml của tôi để làm việc này? Cảm ơn nhiều.

Trả lời

22

Điều này có thể được thực hiện bằng cách thêm các bit sau của ma thuật với bối cảnh mùa xuân (xem docs):

<mvc:annotation-driven/> 

mà trong số những thứ khác, quy định:

Hỗ trợ đọc và viết XML , nếu JAXB có mặt trên classpath.

Nếu JAXB được phát hiện (ví dụ: nếu bạn đang ở trên Java6, hoặc nếu không có một số thực hiện JAXB trên classpath của bạn), điều này sẽ đăng ký một Jaxb2RootElementHttpMessageConverter với bối cảnh, và sẽ cung cấp khả năng để nhổ ra XML từ giá trị trả về của phương thức @ResponseBody-đã được báo cáo.

Lưu ý: Loại câu hỏi được đề xuất của bạn bằng cách sử dụng ViewResolver để hiển thị XML, nhưng điều này là không cần thiết. Chú thích @ResponseBody được thiết kế để bỏ qua toàn bộ lớp xem.

+0

Đồng ý về sưng lên. Mùa xuân cần phải có một giải pháp hộp cho việc này. Thật lố bịch. – sourcedelica

+0

@ericacm: Tôi đã suy nghĩ lại về điều này và đã đi và xem mã nguồn (và * sau đó * đọc lại tài liệu), và nó dễ dàng hơn nhiều so với lần đầu tiên tôi nghĩ. Xem chỉnh sửa. – skaffman

+0

Tôi có jaxb-api-xx.jar trong classpath, nhưng nó dường như không làm gì cả. Tôi có nên chú thích thuộc tính lớp 'SomeObject' với chú thích của JAXB để nó hoạt động không? – limc

7

Những gì tôi làm khi tôi muốn quay trở lại một đại diện XML của các đối tượng sử dụng mùa xuân là tôi xác định một MarshallingView, ví dụ,

<!-- XML view using a JAXB marshaller --> 
<bean id="jaxbView" class="org.springframework.web.servlet.view.xml.MarshallingView"> 
    <constructor-arg> 
     <bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
      <property name="classesToBeBound"> 
       <list> 
        <value>com.company.AClass</value> 
       </list> 
      </property> 
     </bean> 
    </constructor-arg> 
</bean> 

<!-- Resolve views based on string names --> 
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/> 

Lưu ý rằng có một thế giới hoàn toàn của alternatives để jaxb. Bước tiếp theo là

@RequestMapping("/request") 
public ModelAndView sample() { 
    return new ModelAndView("jaxbView", "data", "data_to_be_turned_into_xml"); 
} 

Hoặc nếu bạn muốn sử dụng các chú thích ResponseBody, nó sẽ trông giống như:

@RequestMapping("/request") 
@ResponseBody 
public void sample() { 
    return "data_to_be_turned_into_xml" 
} 

Lưu ý rằng điều này đòi hỏi việc xác định một HttpMessageConverter. Xem tài liệu spring để có mẫu hoàn hảo về cách thực hiện việc này.

+0

Có thể để thực hiện một phương thức trả về hoặc là một "viewname" hoặc @ResponseBody? – trusktr

15

tôi giải quyết vấn đề này với Spring MVC 3 mà không MarshallingView

@RequestMapping(value = "actionName.xml", method = RequestMethod.GET) 
public HttpEntity<byte[]> getXml(ModelMap map, HttpServletResponse response) { 

    String xml = generateSomeXml(); 

    byte[] documentBody = xml.getBytes(); 

    HttpHeaders header = new HttpHeaders(); 
    header.setContentType(new MediaType("application", "xml")); 
    header.setContentLength(documentBody.length); 
    return new HttpEntity<byte[]>(documentBody, header); 
} 

đó là tất cả.lời chào

2

Hãy thử thêm produces = MediaType.APPLICATION_XML_VALUE, tức là

@RequestMapping(value = "/mylink", method = RequestMethod.GET, produces = MediaType.APPLICATION_XML_VALUE) 
0

Thêm produces = MediaType.APPLICATION_XML_VALUE đến RequestMapping và @XmlRootElement để phía trên cùng của đối tượng mô hình của bạn nên làm việc

@RequestMapping(value = "/mylink", method = RequestMethod.GET, produces = MediaType.APPLICATION_XML_VALUE) 
public SomeObject doIt(){ 
    return new SomeObject(); 
} 

@XmlRootElement 
public class SomeObject { 

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