启动时决定的Urls的RequestMapping

时间:2018-10-15 07:24:46

标签: java spring spring-mvc

我有一个案例,或者我想有一个特定的控制器来处理由另一个类中的字段决定的请求模式,这类似于使模式来自资源属性,但是它不是使用$ {propertyName}将是方法的返回类型:

@Controller
public class SomeController {
    private final urlDecider;

    @RequestMapping(urlDecider.getPatterns())
    public String handle(HttpServletREquest request) {}
}

HandlerAdapter似乎与我想要的类似,但是问题在于,supports方法的参数仅具有处理程序作为参数,而没有URL。

2 个答案:

答案 0 :(得分:0)

SpEL可用于执行此操作。在Spring Boot 2 / Spring 5.0.9上测试了以下内容。此示例在同一个bean上调用方法以获取端点名称,但是您可以将SpEL表达式中的bean和方法名称替换为适用于您的应用程序的任何东西。

@Slf4j
@RestController("testBean")
public class TestBean {

  public String endpoint() {
    return "/test";
  }

  @RequestMapping("#{testBean.endpoint()}")
  public void doit() {
    log.info("Hello World");
  }
}

答案 1 :(得分:0)

在查看了DispatcherServlet HandlerMapping及其派生类之后,这似乎正是我想要的:

public class CustomHandlerMapping extends AbstractUrlHandlerMapping {
    @Override
    protected Object lookupHandler(String urlPath, HttpServletRequest request) {
        final List<String> patterns = urlDecider.getPatterns();
        final PathMatcher pathMatcher = getPathMatcher();
        final boolean anyMatch = patterns.stream()
            .anyMatch(pattern -> pathMatcher.match(pattern, urlPath));
        return anyMatch ? someController : null;
    }
}