The resource identified by this request is only capable of generating responses with characteristics

本文解决了在使用Spring MVC将对象转换为JSON串时遇到的HTTP MediaType Not Acceptable异常问题,通过配置适配器和消息转换器实现了正确的JSON转换。

 今天在调试springMVC的时候,在将一个对象返回为json串的时候,浏览器中出现异常:

The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers ().
从网上查了下,说是让配置下json转化bean:

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name="messageConverters">
			<list>
				<ref bean="mappingJacksonHttpMessageConverter" />
			</list>
		</property>
	</bean>
	<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
		<property name="supportedMediaTypes">
			<list>
				<value>application/json;charset=UTF-8</value>
			</list>
		</property>
	</bean>

配置完运行后还是报上述错误。
应该不是配置原因,从http://forum.spring.io/forum/spring-projects/web/82137-spring-3-and-ajax这个网址中查出以下配置:

	<bean id="messageAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <!-- Support JSON --> 
                <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
            </list>
        </property>
    </bean>
	    <bean id="exceptionMessageAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver">
        <property name="messageConverters">
            <list>
                <!-- Support JSON --> 
                <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
            </list>
        </property>
    </bean>

其中第一个和之前的配置没有什么差别,但是第二个exceptionMessageAdapter,这个是处理转化json异常的适配器(这个配置对于调试查找问题还是非常有用的)。

当用这个配置替换上面的配置时,浏览器报了如下异常:

org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation

经查,在http://blog.csdn.net/xplizm/article/details/8205882这篇博文中,提到出现这个问题的原因是因为,@ResponseBody返回的对象中的属性缺少set\get方法。
将返回对象加上set\get方法后,一切ok。

这是xplizm的博文中的总结:

开始总以为是Content-Type或者Accept属性有问题,但找了半天原因才发现这里有个基本的要求:POJO对象要转成Json,则要求POJO中的属性必须都有getter方法,加上getter方法后就正常了 :)


ps:

1.当最后调试正确后,我把上述的配置都注释掉,并加上下面这两个配置:

    <context:annotation-config />  
    <mvc:annotation-driven />

发现也可以正常使用。这说明,可以使用上面的两个简单说明就可以使用springMVC的@ResponseBody注解,并返回json串。

2. 调试配置也是很重要的,调试时报出的异常要比tomcat直接返回的406码要直接的多,更近的接近真相


<think>我们正在处理一个SAP相关的HTTP方法错误。错误信息是:"The specified HTTP method is not allowed for the resource identified by the Data Service Request URI"。 根据引用[1],这个错误表示对于数据服务请求URI所标识的资源,不允许使用指定的HTTP方法。 引用[2]提到了303和302状态码,以及当使用不兼容HTTP/1.1的客户端时,可能需要使用302代替303。 但是,用户的问题是关于SAP中出现这个错误的解决方法。我们需要结合SAP环境来分析。 常见的HTTP方法有:GET, POST, PUT, DELETE, PATCH等。在SAP数据服务中,当我们通过OData服务或者其他Web服务进行数据交互时,可能会遇到此类错误。 可能的原因及解决方法: 1. **检查HTTP方法是否正确**:确认你使用的HTTP方法(GET, POST等)是否符合服务端期望。例如,如果服务端只允许GET,而你使用了POST,则会出现此错误。 - 解决方法:查阅SAP服务的API文档,确认该资源允许的HTTP方法,并调整请求。 2. **检查SAP网关的配置**:在SAP系统中,SAP Gateway是用于暴露OData服务的关键组件。需要检查服务定义中是否允许该HTTP方法。 - 解决方法:在SAP Gateway中检查服务定义(SEGW事务码),确保在实现类中已经实现了对应HTTP方法(如GET_ENTITY, CREATE_ENTITY等)的相应方法。如果没有实现,则需要添加。 3. **检查SICF服务处理程序**:有时,错误可能是由于SICF服务配置不正确导致的。 - 解决方法:使用事务码SICF,检查对应的服务节点,确保处理程序类正确,并且支持该HTTP方法。 4. **检查URL和资源路径**:确认请求的URI是否正确,是否存在拼写错误或者资源不存在的情况。 - 解决方法:仔细检查请求的URI,确保与API文档一致。 5. **检查服务元数据**:OData服务的元数据(metadata)定义了资源的结构和允许的操作。如果元数据中没有声明该HTTP方法,则请求会被拒绝。 - 解决方法:检查元数据(通常通过访问$metadata获取),确认该资源是否支持你使用的HTTP方法。 6. **使用正确的HTTP状态码重定向**:根据引用[2]的内容,当需要重定向时,应该使用303(或302)状态码,并在Location字段中给出新的URI。但这通常是在服务端开发时需要处理的,而不是客户端。 - 如果这个错误是由于服务端配置了重定向而导致的,那么需要检查服务端的重定向配置是否正确。 7. **检查用户代理兼容性**:引用[2]提到,对于不支持HTTP/1.1的用户代理(客户端),使用303状态码可能会出现问题。但这种情况在现代系统中较少见。 - 解决方法:确保客户端支持HTTP/1.1,或者服务端对旧客户端进行兼容处理(使用302)。 8. **检查SAP Note**:SAP可能会发布相关的Note来解决此类问题。 - 解决方法:在SAP支持门户上搜索相关的Note,看看是否有官方提供的补丁或解决方案。 9. **查看服务器日志**:在SAP系统中查看相关的应用日志和网关日志,可能会提供更详细的错误信息。 - 解决方法:使用事务码ST22查看ABAP dump,或者查看网关日志。 10. **网络跟踪**:在客户端和服务器端进行网络抓包,查看实际的HTTP请求和响应,以确定问题。 由于这是一个比较具体的错误,以上步骤需要根据实际情况逐一排查。 注意:在SAP中开发OData服务时,通常会在SAP Gateway Service Builder(事务码SEGW)中定义服务,然后生成实现类。在实现类中,需要重写对应HTTP方法的方法。例如,对于GET请求,需要实现GET_ENTITY或GET_ENTITYSET方法。 如果以上方法都不能解决问题,可能需要联系SAP支持。 下面,我们将生成一些相关问题: </think>### 解决 SAP 中 HTTP 方法不被允许错误的方案 在 SAP 中出现 `The specified HTTP method is not allowed for the resource identified by the Data Service Request URI` 错误,通常表示客户端使用了服务端未配置的 HTTP 方法(如 GET、POST、PUT 等)访问 OData 服务。以下是系统化的解决步骤: --- ### 1. **验证 HTTP 方法类型** - 确认请求使用的 HTTP 方法(GET/POST/PUT/DELETE)是否与 SAP 服务定义一致。 - **检查点**: - 对于数据读取应使用 `GET`,数据创建应使用 `POST`,更新使用 `PUT/PATCH`。 - 示例:若服务仅支持 `GET`,但客户端发送了 `POST` 请求,则触发此错误。 --- ### 2. **检查 SAP Gateway 服务配置** - **事务码 `SEGW`**: 打开 Gateway Service Builder,检查目标服务的 HTTP 方法映射: 1. 定位服务项目 → 展开 `Service Implementation`。 2. 右键点击实体集 → 选择 `Map to Data Source`。 3. 在 `Operation` 选项卡中确认已实现所需方法(如 `Query` 对应 GET,`Create` 对应 POST)[^1]。 - **未实现的方法**:需通过 ABAP 代码补全缺失方法。 --- ### 3. **检查 SICF 处理程序配置** - **事务码 `SICF`**: 验证服务的处理程序是否支持目标 HTTP 方法: 1. 搜索服务节点(如 `/sap/opu/odata`)。 2. 双击节点 → 切换到 `Handler List` 选项卡。 3. 确认处理程序类(如 `CL_REST_HTTP_HANDLER`)已注册所有允许的方法(GET/POST/PUT 等)[^2]。 --- ### 4. **分析 OData 元数据** - 访问服务的元数据 URL(如 `https://<server>:<port>/sap/opu/odata/sap/<service_name>/$metadata`)。 - **验证点**: - 检查 `<EntitySet>` 元素的 `EntityType` 是否包含 `<NavigationProperty>`。 - 确认 `<EntityType>` 下定义了 `<Property>` 且无冲突约束。 --- ### 5. **重定向兼容性处理** - 若涉及 HTTP 重定向(如 302/303 状态码): - 确保响应头 `Location` 字段包含新 URI(引用[^2])。 - 对旧版客户端(不支持 HTTP/1.1),改用 302 状态码替代 303 以兼容[^2]。 - 示例 ABAP 重定向代码: ```abap DATA(lo_redirect) = cl_http_response=>create_from_http2( ). lo_redirect->set_status( code = 302 reason = 'Found' ). lo_redirect->set_header_field( name = 'Location' value = '<new_uri>' ). ``` --- ### 6. **调试与日志分析** - 启用 SAP Gateway 日志: 1. 事务码 `/IWFND/TRACES` → 激活跟踪。 2. 复现错误 → 下载日志分析。 - 检查点: - 定位 `METHOD_NOT_ALLOWED` 错误条目。 - 验证请求 URI 与 HTTP 方法是否匹配服务契约。 --- ### 7. **测试与验证** - 使用 **Postman** 或 **SAP Gateway Client**(事务码 `/IWFND/GW_CLIENT`): - 发送不同 HTTP 方法的请求,确认服务响应。 - 示例成功响应: ```http HTTP/1.1 200 OK Allow: GET, POST ``` --- ### 总结流程图 ```mermaid graph TD A[触发HTTP方法错误] --> B{验证HTTP方法类型} B -->|不匹配| C[修正客户端请求方法] B -->|匹配| D[检查SEGW服务配置] D --> E[补全缺失方法实现] E --> F[测试服务响应] D -->|配置正常| G[检查SICF处理程序] G --> H[注册允许的方法] H --> F F -->|成功| I[问题解决] F -->|失败| J[分析OData元数据] J --> K[修正实体集定义] ```
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值