2011-05-23 70 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" })