【问题标题】:Spring controller method called twiceSpring 控制器方法调用了两次
【发布时间】:2016-07-19 10:36:46
【问题描述】:

我正在制作一个 Spring MVC Web 应用程序。 问题是单个方法被调用了两次,我不知道为什么。

@RequestMapping(value="/profile/{id}", method = RequestMethod.GET)
public String displayUserProfile( @PathVariable String id) {

    System.out.println("asdasddsasd");

    return "account/userProfile";

}

我从这个方法中评论了很多行,但仍然无法正常工作。还试图返回其他视图..运气不好。

在控制台中(写入 ulr 请求):

/demo/account/profile/f91b3a38-6921-41e0-98b7-58dff5cb1152
asdasddsasd
/demo/account/profile/0
asdasddsasd

在第二次调用 tihs 方法后,就到了我的视野

任何其他方法都可以正常工作。 有谁知道这里有什么问题吗?

*我也从这里阅读了类似的问题..没有任何帮助

LE:我在 cmets 中也说过。 有趣的是,如果我将模型设置为视图,则在第二次调用该方法时,我的视图会从第一次调用中获取模型。 (在第二次调用时,id 为 0,模型为空)

【问题讨论】:

  • 清理你的项目并再次运行
  • 您可以尝试启用 Spring 调试日志吗?看看发生了什么
  • subbu,我也没有工作。拉维,我会试试的
  • 方法是如何被调用的?你能发布那个代码吗?您是否也尝试过使用 REST 客户端点击网址?
  • 你也可以粘贴你的html吗?

标签: java spring spring-mvc


【解决方案1】:

听起来像是客户端的问题。

  • 打开浏览器,输入<host/port/whatever_you_need_to access_the_app>/demo/account/profile/f91b3a38-6921-41e0-98b7-58dff5cb1152 并检查日志。您可能只会看到一个条目

  • 现在运行您的客户端代码并检查对服务的网络请求。如果您从 Chrome F12-> 网络选项卡之类的浏览器调用控制器应该会有所帮助。

我知道这是一种明显的,但我认为这个控制器并没有什么真正“不寻常”的地方,所以它应该更多地处于一般流程的水平。在这种情况下,最好跟踪 HTTP 流量并查看它有多少/何时/如何向您的控制器生成请求。

【讨论】:

  • 已经尝试过第一件事,但它仍然被调用了两次。我会尝试你的第二个建议
  • 肯定不是,我使用的是开发者工具中的soap ui和浏览器网络标签,所以我知道只有一个请求发出。
【解决方案2】:

我终于有时间在这里找到解决方案。 尝试了很多方法,但都没有成功。

我将@PathVariable 替换为@RequestParam 并且URL 没有被访问两次:)

【讨论】:

  • 可能是因为启用了 CORS?但是我有同样的问题,但仍然没有找到解决方案,因此我不能接受这个作为答案。
【解决方案3】:

我还观察到一个 GET 请求导致控制器方法执行两次。使用 Chrome 浏览器请求服务时出现问题(使用 Postman 时未出现问题)。就我而言,罪魁祸首是 JSONView Chrome 扩展。

我通过使用 Chrome 开发者工具的网络标签确定了原因。它显示我的 GET 服务被请求了两次。第二个请求由 content.js 发起,这是一个与 JSONView 捆绑在一起的 JavaScript 文件。

在我禁用 JSONView 扩展后,通过 Chrome 的 GET 请求会导致控制器方法只执行一次。

【讨论】:

  • 我有同样的问题,我不知道它是哪个扩展...只是禁用最多...我有一些 SnappySnipped 可能是它..
  • 在我的情况下,网络选项卡只显示了一个 GET 请求,但我仍然在 Spring 方面得到了两次点击......奇怪。
  • 您可以查看嵌入式服务器日志来验证应用程序是否只接收一个请求。这是一个堆栈溢出链,讨论 Spring 中的嵌入式服务器日志记录...stackoverflow.com/questions/48312851/…
  • 也许是 Chrome 与 BrowserSync 的结合!? PUT 请求也存在同样的问题。首先它发送了新数据,200-800 毫秒后它发送了旧数据,这使我的更改消失了。但是我一关闭 Chrome 开发者工具视图,它就消失了……
【解决方案4】:

遇到了同样的问题。 最终我发现我在背景图片网址中有一个null,如下所示:

style="background-image: url(null);"

导致发送另一个带有路径变量null 的GET。

【讨论】:

    【解决方案5】:

    我经历了这种被调用两次的现象,因为 BrowserSync 在每个打开的 BrowserSync 浏览器窗口中重放 HTTP 请求。

    【讨论】:

    • 也许是 Chrome 与 BrowserSync 的结合!? PUT 请求也存在同样的问题。首先它发送了新数据,200-800 毫秒后它发送了旧数据,这使我的更改消失了。但是我一关闭 Chrome 开发者工具视图,它就消失了……
    • 在我的情况下,这是因为我在运行 BrowserSync 时在 2 个不同的浏览器中打开了两次相同的页面。
    【解决方案6】:

    我有同样的问题,找到了很多解决方案,最后我找到了简单的原因。它在我的 html 模板 css: background:url() 中。 这种感冒将再次运行相同的网址。所以我只需将其删除或将 url 放在括号中即可。

    【讨论】:

    • 考虑详细说明“所以我只需将其删除或将 url 放在括号中即可。”一点,以便您的新答案将来对用户更有用。
    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 2013-12-31
    相关资源
    最近更新 更多