簡體   English   中英

Spring 控制器方法調用了兩次

[英]Spring controller method called twice

我正在制作一個 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:我在評論中也說過。 有趣的是,如果我將模型設置為視圖,則在第二次調用該方法時,我的視圖會從第一次調用中獲取模型。 (在第二次調用中,id 為 0,模型為空)

我還觀察到一個 GET 請求導致控制器方法執行兩次。 使用 Chrome 瀏覽器請求服務時出現問題(使用 Postman 時未出現問題)。 就我而言,罪魁禍首是 JSONView Chrome 擴展。

我通過使用 Chrome 開發人員工具的網絡選項卡確定了原因。 它顯示我的 GET 服務被請求了兩次。 第二個請求由 content.js 發起,這是一個與 JSONView 捆綁在一起的 JavaScript 文件。

在我禁用 JSONView 擴展后,通過 Chrome 的 GET 請求將導致控制器方法只執行一次。

我經歷了這種稱為兩次的現象,因為BrowserSync在每個打開的 BrowserSync 瀏覽器窗口中重放 HTTP 請求。

我終於有時間在這里找到解決方案。 嘗試了很多東西,但沒有奏效。

我用@RequestParam 替換了@PathVariable,並且沒有兩次訪問該URL :)

聽起來像是客戶端的問題。

  • 打開瀏覽器,輸入<host/port/whatever_you_need_to access_the_app>/demo/account/profile/f91b3a38-6921-41e0-98b7-58dff5cb1152並查看日志。 您可能只會看到一個條目

  • 現在運行您的客戶端代碼並檢查對服務的網絡請求。 如果您從 Chrome F12-> 網絡選項卡之類的瀏覽器調用控制器應該會有所幫助。

我知道這是一種明顯的,但我認為這個控制器並沒有什么真正“不尋常”的,所以它應該更多地處於一般流程的水平。 在這種情況下,最好跟蹤 HTTP 流量並查看它有多少/何時/如何向您的控制器生成請求。

有同樣的問題。 最終我發現我在背景圖像 url 中有一個null ,如下所示:

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

這導致發送另一個帶有路徑變量null的 GET 。

我有同樣的問題並找到了很多解決方案,最后我找到了簡單的原因。 它在我的 html 模板 css: background:url() 中。 這種感冒將再次運行相同的網址。 所以我只需將其刪除或將 url 放在括號中即可。

這也可能由於另一個原因而發生。 因為我發現了同樣的事情並觀察到了以下情況。

  • 第一次處理您的請求並且您在控制台中看到 println 語句時。 如果您在控制器方法的方法請求處刷新瀏覽器(例如 http://localhost:8080/DemoMVC/add?***),則每次刷新您的 tomcat 處理請求時,您都會在控制台中獲得相同的 println 語句。

也許這為時已晚。 但是,我仍然面臨這些問題並且每次都忘記解決方案。

如果您使用任何 JS 庫,如 Angular 或 React,那么在您的服務調用中也要觀察響應。

這是一個代碼片段

return this.http.get<User>(`${this.resourceUrl}/activate`, { params: options, observe: 'response' })
  .pipe(
    filter((response: HttpResponse<User>) => response.ok),
    map((response: HttpResponse<User>) => response.body),
    catchError(error => {
      return of(error)
    })
  );

要關注的關鍵領域是{ params: options, observe: 'response' }

我有一個正在監聽localhost/的控制器和一個匹配路徑變量的 get 方法,如下所示:

@GetMapping("/{foo}")
String get(@PathVariable(required = false) String foo)
{
    return "hello world";
}

問題是,在調用localhost/之后,我接到了第一個電話,之后,我接到了第二個電話圖標。

如果您要定義上下文根,情況也是如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM