Java 405不允许使用弹簧的方法

Java 405不允许使用弹簧的方法,java,spring,http,spring-mvc,retrofit,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";

我对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);
}
@RequestMapping(method=RequestMethod.POST,value=“/video/{id}/data”)
public void postVideoData(@PathVariable(“id”)长videoId,
@RequestParam(“数据”)多部分文件(视频数据)引发IOException{
if(videoId videos.size()){
抛出新的ResourceNotFoundException(“无效id:+videoId”);
}
视频=videos.get((int)videoId-1);
InputStream in=videoData.getInputStream();
管理器。保存视频数据(视频,在中);
}

问题是我得到了一个“405方法不允许”错误。我做错了什么,以至于我的POST方法无法被识别?

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

的方法,我不知道您是否已经解决了问题,但我得到了相同的错误,因为我也是新改型的:)

对于我来说,解决方案是放置一个注释来指定响应内容类型(在我的例子中)

@ResponseBody
我必须做的另一个更改是更改自定义状态的
void

希望这对你有所帮助,或者至少给你一点启示


Rgds.

我也有同样的问题。改装请求调用的最后一个参数必须是返回类型或回调

因此,在改装的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;
}

我不熟悉这个框架,但是一个说postVideoData,另一个说setVideoData,这有关系吗?@Douglas No.一个是客户端Java方法,另一个是服务器端方法。只要两者使用相同的HTTP接口进行通信,名称就不必相同。好的,我想这是通过视频数据路径等完成的。它们设置正确吗?@Douglas添加了常量定义以进行澄清。是的,看起来都很好,抱歉我帮不上忙。我不太明白videoSvc.setVideoData的返回值是如何生成的,但我不知道这会导致什么问题。唯一的其他猜测是检查失败的是帖子。videoSvc.getData调用是否会失败?您的意思是
@ResponseBody