使用XML的Spring 3 REST给出“ 406不可接受”

问题描述

| 我正在尝试使用Spring 3实现REST Remoting,但无法解决“ 406 Not Acceptable \”错误... 我尝试远程1服务返回一个应用程序/ xml内容。每次我发送带有\“
Accept=application/xml
\”的请求时,都会出现406错误。每次我使用不同的\“ Accept \”标头发送它时,都会得到404(和handleNoSuchRequestHandlingMethod异常)。我可以在日志中看到该服务本身的调用。我还发现,在servlet初始化期间,我收到以下错误,尽管我不确定这是否是一个问题: 找不到任何要委托给的ViewResolvers;请使用ContentNegotiatingViewResolver上的\'viewResolvers \'属性配置它们 我尝试了许多不同的配置,但没有成功。也许您可以在我的实现中发现一些错误? 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\",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();
    

解决方法

考虑使用以下方法代替@ResponseBody
@RequestMapping(value = \"experts\",method = RequestMethod.GET)
public @ResponseBody
void getExperts(org.springframework.ui.Model model) {            
      model.addAttribute(new ExpertDto());
}
\“未找到要委托给...的任何ViewResolvers”只是警告,您可以忽略它。     ,将您的@RequestMapping注释修改为
@RequestMapping(value = \"experts\",method = RequestMethod.GET,headers = { \"Accept=application/xml\" })
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...