2011-05-23 75 views
2

我試圖使用Spring 3實現REST Remoting,但是我無法通過「406 Not Acceptable」錯誤... 我嘗試使用遠程1服務返回一個application/xml內容。每次我發送一個請求「Accept=application/xml」,我得到406錯誤。每次我發送它與一些不同的「接受」頭,我得到404(和handleNoSuchRequestHandlingMethod異常)。服務本身被調用,因爲我可以在日誌中看到它。什麼我也發現是servlet的初始化過程中出現了以下錯誤,雖然我不知道這是否是一個問題:Spring 3 REST與XML給出「406不可接受」

Did not find any ViewResolvers to delegate to; please configure them using the 'viewResolvers' property on the ContentNegotiatingViewResolver

我已經嘗試了許多不同的配置,但沒有成功。也許你可以在我的實現中發現一些錯誤?

extService-servlet.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" 
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:task="http://www.springframework.org/schema/task" xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:oxm="http://www.springframework.org/schema/oxm" xmlns:p="http://www.springframework.org/schema/p" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
         http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd 
         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
         http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd 
         http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd 
         http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 

    <context:component-scan base-package="ch.epimmo.immogreen.backend.mvc" /> 

    <mvc:annotation-driven /> 

    <oxm:jaxb2-marshaller id="jaxbMarshaller"> 
     <oxm:class-to-be-bound name="ch.epimmo.immogreen.common.dto.ExpertDto" /> 
    </oxm:jaxb2-marshaller> 


    <bean 
     class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" 
     p:order="#{T(org.springframework.core.Ordered).HIGHEST_PRECEDENCE}"> 
     <property name="defaultContentType" value="text/html" /> 
     <!-- <property name="ignoreAcceptHeader" value="true" /> --> 
     <property name="favorPathExtension" value="true" /> 
     <property name="mediaTypes"> 
      <map> 
       <entry key="xml" value="application/xml" /> 
      </map> 
     </property> 
     <property name="defaultViews"> 
      <list> 
       <bean class="org.springframework.web.servlet.view.xml.MarshallingView"> 
        <property name="marshaller" ref="jaxbMarshaller" /> 
       </bean> 
      </list> 
     </property> 
    </bean> 
</beans> 

控制器

@Controller 
@RequestMapping({ "extService" }) 
public class ExtServiceController { 

    protected final static Logger LOGGER = Logger.getLogger(ExtServiceController.class); 

    @Autowired 
    private UserManagementService userManagementService;  

    // @RequestMapping(value = "/experts", method = RequestMethod.GET, headers = { "Accept=*/*" }) 
    // @RequestMapping(value = "experts", method = RequestMethod.GET) 
    @RequestMapping(value = "experts", method = RequestMethod.GET, headers = { "Accept=application/xml, text/xml" }) 
    public @ResponseBody 
    ExpertDto getExperts() {    
       return new ExpertDto(); 
    } 
} 

測試

DefaultHttpClient httpClient = new DefaultHttpClient(); 

String expertsUrl = "http://localhost:8080/extService/experts"; 

HttpGet getRequest = new HttpGet(expertsUrl); 
getRequest.setHeader(new BasicHeader("Accept", "application/xml")); 
// getRequest.setHeader(new BasicHeader("Accept", "text/html")); 
// getRequest.setHeader(new BasicHeader("Accept", "*/*")); 

HttpResponse response = httpClient.execute(getRequest); 
HttpEntity entity = response.getEntity(); 
InputStream content = entity.getContent(); 

回答

0

Ç onsider使用以下方法,而不是@ResponseBody

@RequestMapping(value = "experts", method = RequestMethod.GET) 
public @ResponseBody 
void getExperts(org.springframework.ui.Model model) {    
     model.addAttribute(new ExpertDto()); 
} 

的「沒有找到任何ViewResolvers委託給......」只是一個警告,你可以忽略它。

0

修改您的@RequestMapping註解爲

@RequestMapping(value = "experts", method = RequestMethod.GET, headers = { "Accept=application/xml" })