![](/img/trans.png)
[英]How to get parameters from RequestBody in Spring REST controller method
[英]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);
}
}
我們將作為我們的請求的BindingResult
和BindingResult
將使用的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.