有没有办法使用用于@RequestMapping
注释中path
(或value
(变量的表达式语言来匹配字符串?例如,给定字符串
/api/foo/bar/1
表达式
/api/foo/bar/{id}
应该匹配此字符串(如果表达式与给定字符串匹配,则应提供返回布尔true
的测试(,如果可能,字符串的捕获部分(即{id}
捕获1
(也应该可用。
从本质上讲,我希望使用与 Spring 内部用于@RequestMapping
相同的机制来检查 URL 路径(上下文路径和路径信息的组合(在表达式语言中是否匹配为 @RequestMapping
。我正在使用 Spring 安全过滤器进行匹配。
谢谢你的帮助。
我建议为此使用方面。有了方面,您可以简单地注释管理器界面方法,例如 @LogOnSuccess
.
public class UserManager{
...
@LogOnSuccess
public UserDto createUser(UserDto newUser)
return userManager.createUser(newUser);
}
}
如果在方法调用期间未发生异常,则使用@AfterReturning
点切割将仅调用绑定到批注的自定义操作。这样,您只会记录成功的请求。此外,它非常易于使用且可读性强。
有很多关于这个的好教程:例如Spring AOP示例教程
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.springframework.http.server.PathContainer;
import org.springframework.web.util.pattern.PathPattern;
import org.springframework.web.util.pattern.PathPatternParser;
@RunWith(JUnit4.class)
public class PathPatternTest {
@Test
public void testTrue() {
Assert.assertTrue(isPatternMatchUri("/users/{userId}", "/users/h49IB7A2B8r3eSg4q"));
Assert.assertTrue(isPatternMatchUri("/users/{userId}", "/users/123456"));
Assert.assertTrue(isPatternMatchUri("/users/{userId}", "/users/xxx?32321321"));
Assert.assertTrue(isPatternMatchUri("/users/{userId}", "/users/1234"));
}
@Test
public void testFalse() {
Assert.assertFalse(isPatternMatchUri("/users/{userId}/{token}", "/user/h49IB7A2B8r3eSg4q"));
Assert.assertFalse(isPatternMatchUri("/users/{userId}", "/users/xxxx/12121"));
Assert.assertFalse(isPatternMatchUri("/{userId}", "/usrs/xxx/WWQQS?"));
}
/***
* is pattern match the request uri.
*/
public boolean isPatternMatchUri(String pattern, String url) {
PathPatternParser pathPatternParser = new PathPatternParser();
PathPattern pathPattern = pathPatternParser.parse(pattern);
PathContainer pathContainer = PathContainer.parsePath(url);
return pathPattern.matches(pathContainer);
}
}