405 Spring不允许的方法

时间:2014-07-27 21:26:52

标签: java spring http spring-mvc retrofit

我对HTTP端点进行了以下测试:

public static final String DATA_PARAMETER = "data";

public static final String ID_PARAMETER = "id";

public static final String VIDEO_SVC_PATH = "/video";

public static final String VIDEO_DATA_PATH = VIDEO_SVC_PATH + "/{id}/data";

@Multipart
@POST(VIDEO_DATA_PATH)
public VideoStatus setVideoData(@Path(ID_PARAMETER) long id, @Part(DATA_PARAMETER) TypedFile videoData);

@Test
public void testAddVideoData() throws Exception {
    Video received = videoSvc.addVideo(video);
    VideoStatus status = videoSvc.setVideoData(received.getId(),
            new TypedFile(received.getContentType(), testVideoData));
    assertEquals(VideoState.READY, status.getState());

    Response response = videoSvc.getData(received.getId());
    assertEquals(200, response.getStatus());

    InputStream videoData = response.getBody().in();
    byte[] originalFile = IOUtils.toByteArray(new FileInputStream(testVideoData));
    byte[] retrievedFile = IOUtils.toByteArray(videoData);
    assertTrue(Arrays.equals(originalFile, retrievedFile));
}

我正在尝试使用Swing中定义的以下端点来实现此测试定义的要求:

@RequestMapping(method = RequestMethod.POST, value = "/video/{id}/data")
public void postVideoData(@PathVariable("id") long videoId,
        @RequestParam("data") MultipartFile videoData) throws IOException {
    if (videoId <= 0 || videoId > videos.size()) {
        throw new ResourceNotFoundException("Invalid id: " + videoId);
    }

    Video video = videos.get((int)videoId - 1);
    InputStream in = videoData.getInputStream();
    manager.saveVideoData(video, in);
}

问题是我收到“405 Method Not Allowed”错误。我做错了什么,以至于我的POST方法无法识别?

3 个答案:

答案 0 :(得分:2)

问题是客户端接口需要从服务器返回VideoStatus个对象。我在服务器端声明了方法返回void

答案 1 :(得分:0)

我不知道你是否已经解决了问题,但我也遇到了同样的错误,因为我也是Retrofit的新手:)。

我的解决方案是在我的情况下使用Annotation来指定响应内容类型

@ResponseBody

我必须做的另一项更改是更改void以获取自定义状态。

希望这有助于或者至少为您提供帮助。

RGDS。

答案 2 :(得分:0)

我有同样的问题。 RetroFit请求调用必须具有返回类型或Callback作为最后一个参数。

所以在RetroFitted API中:

@POST("/path")
public Void saveWhatever(@Body Whatever whatever);

在控制器中必须是:

@RequestMapping(value = "/path", method = RequestMethod.POST)
public @ResponseBody Void saveWhatever(@RequestBody Whatever whatever) {
    repository.save(whatever);
    return null;
}