在Stack Overflow潜伏的同事程序员。
今天的问题:如何从启动时获取Spring MVC Framework中的绝对baseUrl?
我正在为一个应用程序使用Spring MVC Framework,我正处于这种情况:假设我需要创建类Foo的对象,插入到列表中。每个对象都包含一个独特的自我链接(我正在使用org.springframework.hateoas.Link作为实际应用程序,但这不是重点)。
示例代码:
class Foo{
private int ID;
private String absoluteUrl;
public Foo(int ID, String baseUrl){
this.ID = ID;
this.absoluteUrl = baseUrl + ID;
}
public void setAbsoluteUrl(String baseUrl){
this.absoluteUrl = baseUrl + this.ID;
}
}
如果我通过工厂运行它,它可能看起来像这样:
public List<Foo> GenerateFooList(String baseUrlFetchedBySpring){
List<Foo> list = new ArrayList();
for (int i = 0; i<100; i++){
list.add(new Foo(i, baseUrlFetchedBySpring);
return list;
}
我期望在测试阶段产生的基础地址为“http://localhost:8000”(或假设,在生产时,“http://www.fooExample.com”)。
我的问题:我需要在启动时从Spring MVC Framework获取baseUrl。
我正在使用的Spring MVC应用程序仅由注释配置。我发现可以通过使用HttpServletRequest.getRequestURL()。toString()来获取绝对URL,但据我所知,应用程序在启动后收到这些,而我从头开始需要baseUrl。毕竟,Spring API将HttpServletRequest描述为:“定义一个对象以向servlet提供客户端请求信息”,换句话说,是在启动后从客户端发送的请求。
我当然可以通过在代码中编写私有的最终String来添加静态baseUrl:
private final String BASE_URL = "http://www.fooExample.com/"
但是如果应用程序的base-url随着时间的推移发生了变化,那么如果基本URL可以由Spring MVC自动设置会更好。假设我有一个使用依赖注入的Cache类:
@Repository
class FooCache{
List<Foo> list;
SpringObject springObject; // = ???????????
@Autowired
public FooCache(SpringObject springObject){
this.springObject = springObject; // = ???????????
initCache();
}
public void initCache(){
for (int i = 0; i<100; i++){
list.add(new Foo(i, springObject.getAbsoluteBaseUrl()); // method = ???????????
}
}
这是我正在寻找的更多内容:缓存只在开始时设置一次,使用Spring中包含我需要的信息的对象。最有可能的是,它是一个配置类,它是框架的一部分,但在互联网上搜索了一段时间后,我发现的主要是与HttpServletRequest相关的解决方案。
我真正想要的Spring类/对象和方法是什么?或者你还有什么建议从一开始就获取base_url?
我需要这个绝对的基本网址,而不是相对的。
答案 0 :(得分:1)
没有单一的&#34;基本网址&#34;为您的应用程序。想一想 - 您可以访问您的生产服务器:
如果您不想或不能反映&#34;基本网址&#34;请求,我的建议是有一个&#34;规范的基本网址&#34;根据环境配置,例如。在属性中。但是如果你的情况有意义的话,这取决于你。
答案 1 :(得分:0)
如果您使用的是java配置和Servlet 3.0+样式(没有web.xml),则可以使用WebApplicationInitializer
实现,例如:
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet());
registration.setLoadOnStartup(1);
registration.addMapping("/example/*");
}
}
通过这种安排,您可以使用servletContext.getContextPath()
获取基本网址。
答案 2 :(得分:0)
如果没有请求,你无法知道。你可以使用InetAddress
并解析主机信息,但我猜这不是你想要的。
假设您有两个域www.foo.com和www.bar.com指向运行应用程序的主机。在启动时,您没有任何相关的信息,您将不得不进行反向DNS搜索。 当您收到请求时,您可以获得其来源的信息。
您应该根据请求填写链接,以便您可以删除缓存请求范围信息。