簡體   English   中英

Spring REST 從路由獲取控制器 + 方法?

[英]Spring REST get controller + method from route?

是否有內置的 Spring 方式說給我“/customers/a”(/customers/{id})的 RestController + 方法? 即執行標准的彈簧路由,但知道將調用哪個類/方法?

我試圖在一個中心位置根據路線確定該方法是否具有特定注釋。 用於集中請求/響應日志記錄。

我可以遍歷其余控制器的應用程序並自己構建地圖,但想知道是否已經暴露了任何東西來知道請求會去哪里?

謝謝。

您可以使用 Spring AOP 模塊。 我認為一種干凈的方法(在不中斷 RestController 端點流的情況下管理響應)可以是以下內容。

首先添加spring-boot-starter-aop 依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

讓我們看看代碼。

這是我們的ExampleRequest

import lombok.Data;

@Data
public class ExampleRequest {
    String name;
}

我們假設我們想要驗證我們的請求 -> 如果 name == "anonymous" 我們想要返回一個 HTTP 狀態 BAD_REQUEST。


這是我們的TestController

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestController {
    @Anonymous
    @GetMapping("")
    public ResponseEntity<String> test(ExampleRequest exampleRequest, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        else return new ResponseEntity<>(HttpStatus.OK);
    }    
}

我們將作為我們的請求的BindingResultBindingResult將使用的ExampleRequest作為參數傳遞。 無論如何,如果 bindingResult 有錯誤,我們的驗證邏輯就會被破壞,所以我們需要返回我們想要的錯誤!

@Anonymous是我們的自定義注解,我們將使用它來告訴我們的 Advice(s) 哪些方法,或者更好 - 哪些類(Aspect 是“代理”的整個類),我們想要代理

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Anonymous {

}  

還有我們的TestAspect

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import org.springframework.validation.BindingResult;

@Aspect
@Component
public class TestAspect {

    @Before(value = "@annotation(Anonymous) && args(exampleRequest, bindingResult,..)", argNames = "joinPoint,exampleRequest,bindingResult")
    public Object logExecutionTime(JoinPoint joinPoint, ExampleRequest exampleRequest, BindingResult bindingResult) throws Throwable {
        if (exampleRequest.getName().equals("anonymous")) bindingResult.rejectValue("name", "incorrect");
        return joinPoint;
    }

}   

我們要說的是:執行帶有這些參數的定義ANONYMOUS注釋的每個方法之前,執行此邏輯!

顯然,您將擁有自定義的驗證邏輯,因此請實施它。


正如我在上面的評論中所說的那樣,我認為您可以直接從代理類返回錯誤,但同時我認為這個示例是使用 AOP 的更簡潔的方式(使用 BindingResult 端點的流程受到尊重,這種技術確實如此) t 破壞模型類的其他驗證。你可以使用 javax 驗證,例如混合在建議中,一切都會完美地工作!),我個人喜歡這個 Spring AOP 模塊,但不要濫用它

供參考: https : //docs.spring.io/spring/docs/2.5.x/reference/aop.html

您可能想嘗試另一種方法:

使用 spring 支持的面向方面編程。 創建一個方面,作為所有控制器的攔截器。 Advice 將在實際的 rest 方法之前(或“代替”,取決於建議的類型)被調用,以便您能夠獲得訪問權限,然后將執行轉發給真正的控制器。 在方面的代碼中,您可以內省要在真實控制器上調用的方法並確定它是否具有注釋。

我發現正是這樣的例子在這里(你得稍微改變一點的界定,以使縱橫適用於您所選擇的其他控制器)。

暫無
暫無

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

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