2

我的前端有一个 ajax 请求,它将 JSON 文档发送到休息服务实现。它通过 Spring 连接起来,REST 服务中的 @GET 请求运行良好。

问题是,每当我尝试使用 @POST 方法时,它总是会引发 415 错误。

我已经尝试根据在线的各种指南来操纵我如何将其发回以及 post 方法中接受的变量类型,但我不确定下一步该往哪里看。

我已经仔细检查过我确实有数据被发送到 @POST 方法,但我觉得它根本没有解析 JSON 并抛出错误。

不幸的是,如果这是问题,我不知道如何解决。

下面我将所有内容简化为一个仍然会产生 415 错误的简单形式。

AJAX 请求:

function post_request(json_data) {
    $j.ajax({
        url : '../api/createDisplayGroup/postHtmlVar/' + containerID + '/' + containerType,
        data: JSON.stringify(json_data),
        dataType: 'json',
        type : 'post'
    }).done(function(response) {
        run_update(response);
    }).error(function(jQXHR, textStatus, errorThrown) {
        alert('error getting request');
    });
};

春天 XML:

<jaxrs:server id="displayGroupService" address="/createDisplayGroup">  
      <jaxrs:serviceBeans>  
                <ref bean="peopleFilterRestService" />  
      </jaxrs:serviceBeans>  
      <jaxrs:providers>  
                <ref bean="jacksonJsonProvider"/>  
                <!-- disable XHR token check - allow external sources to call the service -->
                <!--ref bean="securityInterceptor" /-->  
      </jaxrs:providers>  
</jaxrs:server>

<bean id="peopleFilterRestService" class="mil.milsuite.community.rest.PeopleFilterRestService">
    <property name="peopleFilterService" ref="peopleFilterService"/> 
</bean>

<bean id="peopleFilterService" class="mil.milsuite.community.members.service.PeopleFilterServiceImpl">
    <property name="communityManager" ref="communityManager"/> 
    <property name="socialGroupManager" ref="socialGroupManagerImpl"/>
</bean>

REST 实现(仅@POST):

@POST
 @Path("/postHtmlVar/{containerId}/{contentType}")
 @Consumes(MediaType.APPLICATION_JSON)
 public List<TabDefinition> postHtml(@PathParam("containerId") String containerId, @PathParam("contentType") String contentType, List<TabDefinition> displayGroups) {
     Long contId = Long.parseLong(containerId);
     Long contType = Long.parseLong(contentType);


     //return convertToResponse(peopleFilterService.getDisplayGroups(contId, contType));*/

     return testDisplayGroup();
} 
4

1 回答 1

2

您收到的错误如下:

415 不支持的媒体类型

请求实体具有服务器或资源不支持的媒体类型。例如客户端上传图片为image/svg+xml,但服务器要求图片使用不同的格式。(维基百科

原因可能是$j.ajax调用,尝试添加contentType参数,例如:

...
$j.ajax({
    url : '../api/createDisplayGroup/postHtmlVar/' + containerID + '/' + containerType,
    data: JSON.stringify(json_data),
    dataType: 'json',
    type : 'post',
    contentType: 'application/json'
...

然后,这将匹配@Consumes您的方法使用的注释的值postHtml,请注意:

@Consumes 注释用于指定资源可以从客户端接受或使用的表示的 MIME 媒体类型。(甲骨文

默认情况下,ajax调用的媒体类型为application/x-www-form-urlencoded,因此您的处理程序方法将不匹配,从而导致415错误。

旁白:在 ajax 调用中,contentType指定要发送到服务器dataType的数据类型,而指定将返回的数据类型。

于 2013-08-12T15:09:56.877 回答