【问题标题】:Why spring mvc put mapping method requests return redirect as put method为什么spring mvc put映射方法请求将redirect作为put方法返回
【发布时间】:2020-07-05 14:35:09
【问题描述】:

Hi,我正在使我的个人项目像“可教”一样。

我遇到了一个问题。

我想向服务器发送 PUT 请求并将服务器重定向到其他 url(GET 请求)。

  1. 请求“PUT /course/1/edit”
  2. 服务器处理一些逻辑并重定向到“GET /members/1/courses/manage”

但是,服务器没有工作。

Spring MVC 错误消息是Request method 'PUT' not supported

Chrome 控制台错误是PUT http://localhost:8080/members/1/courses/manage 405

如果请求映射是 POST 并且 GET 不是 PUT,则返回重定向工作正常。

我只是想知道为什么 PUT 映射返回重定向请求重定向为 PUT 方法。

下面,Spring MVC 发现视图名称“redirect:/members/1/courses/manage” 并使用 PUT 方法重定向到“members/1/courses/manage”。至此,我不明白为什么spring mvc使用PUT方法来重定向了。

o.s.web.servlet.view.RedirectView        : View name 'redirect:/members/1/courses/manage', model {}
o.s.web.servlet.DispatcherServlet        : Completed 302 FOUND
o.s.web.servlet.DispatcherServlet        : PUT "/members/1/courses/manage", parameters={}
.w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'PUT' not supported]
o.s.web.servlet.DispatcherServlet        : Completed 405 METHOD_NOT_ALLOWED

如果你知道任何文件可以帮助我解决这个问题,请推荐给我。

提前致谢!

前台代码

function courseEdit(courseUrl) {
    let formDataArray = $("#course-edit-form").serializeArray();
    let formDataObject = {};
    for (const element of formDataArray) {
        formDataObject[element.name] = element.value;
    }
    let courseEditFormDataJsonFormat = JSON.stringify(formDataObject);

    $.ajax({
        type: 'PUT',
        url: courseUrl,
        data: courseEditFormDataJsonFormat,
        contentType: 'application/json'
    }).done(function( data, textStatus, jqXHR ) {

    });
}

回码

@PutMapping("/courses/{id}")
public String editCourse(@PathVariable Long id, @RequestBody CourseDto courseDto) {
        CourseDto foundCourseDto = courseService.findById(id);
        Long instructorId = foundCourseDto.getInstructor().getId();

        // redirect:/members/1/courses/manage
        return "redirect:/members/"+instructorId+"/courses/manage";
}

@GetMapping("/members/{id}/courses/manage")
public String courseDashboard(@PathVariable Long id, Model model) {
    CoursesDto ownCourse = courseService.findOwnCourse(id);
    model.addAttribute("coursesDto", ownCourse);
    return "course/course_dashboard";
}

【问题讨论】:

  • 在这个问题的答案中有几个可能的事情要检查:stackoverflow.com/questions/35381402/…
  • 您没有显示有问题的 URL,但请注意 (1) 您似乎将 JSON 样式的 API 与页面加载 API 混合在一起,这种方式肯定会让您头疼(2) 课程资源的 URL 只是/courses/{id},PUT 表示你要修改它而不需要edit
  • @AlexWittig 感谢分享链接
  • @chrylis-onstrike- 谢谢,我更新了我的代码,没有使用edit。我可以知道如何将 JSON 样式的 API 与页面加载 API 一起使用吗?在这个问题之前,有可能吗?

标签: java ajax spring spring-boot spring-mvc


【解决方案1】:

您的 @PutRequest 正在转发到 /members/{id}/courses/manage,这是一个 @GetMappingendpoint。

正如chrylis -on strike- 指出的那样,这不是你应该这样做的方式。

您应该在 ajax 请求完成后在前端进行重定向。 您可以使用window.location 执行此操作。

例子:

$.ajax({
        type: 'PUT',
        url: courseUrl,
        data: courseEditFormDataJsonFormat,
        contentType: 'application/json'
    }).done(function( data, textStatus, jqXHR ) {
        // logic here to get {id} value
        window.location = "/members/{id}/courses/manage"
    });

在输入表单的请求{id}中添加输入真实id值的逻辑。

顺便说一句,return "redirect:/members/1/courses/manage"; 中有一个硬编码的 1

@PutMapping("/courses/{id}/edit")
public String editCourse(@PathVariable Long id, @RequestBody CourseDto courseDto) {
    return "redirect:/members/1/courses/manage";
}

【讨论】:

  • @HardLearner 很好 - 帖子的其余部分是否回答了您的问题,还是您需要更多说明?
  • 其实我有个问题。为什么 spring mvc 使用 PUT 方法重定向重定向 url。在 PostMapping 方法的重定向是通过 GET 进行的。但是,PutMapping 方法的重定向是通过 PUT 进行的。我更新了相关的调试消息。你能检查我帖子上的第一个代码块吗?我只是想知道为什么 spring mvc 是这样工作的。
【解决方案2】:

我也遇到了这个问题。我已将@GetMapping 更改为@RequestMapping,以这种方式,尽管它是从Put 请求重定向的,但它可以工作。但是当我吃东西的时候,我碰巧想知道它为什么会这样。

【讨论】:

  • 我解决了这个问题。关键字是“重定向”、“HttpStatusCode:303(SEE OTHER)”。我会在这个周末写详细的评论或回答。
猜你喜欢
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
相关资源
最近更新 更多