潜伏在Stack fellow的程序员们。
今天的问题是:我如何才能从启动时获得Spring框架中的绝对baseUrl?
我正在为一个应用程序使用Spring框架,我就是在这种情况下:假设我需要将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框架获得baseUrl。
我正在使用的Spring应用程序仅通过注释进行配置。我发现通过使用HttpServletRequest.getRequestURL().toString(),可以获得一个绝对的url,但据我所知,应用程序在启动后接收这些url,而我从一开始就需要baseUrl。毕竟,Spring将HttpServletRequest描述为:“定义一个对象以向servlet提供客户端请求信息”,换句话说,是启动后从客户端发送的请求。
当然,我可以通过在代码中编写一个私有的最终字符串来添加一个静态baseUrl:
private final String BASE_URL = "http://www.fooExample.com/"
但是,如果随着时间的推移,应用程序的基url会发生变化,最好是使用Spring自动设置基url。假设我有一个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的其他建议是什么?
我需要这个绝对的基本url,而不是相对的。
发布于 2015-09-14 21:02:27
您的应用程序没有单一的“基本URL”。想想看--您可以访问生产服务器:
如果您不想或不能反映请求的“基本URL”,我的建议是为每个环境配置一个“规范的基本URL”。在房产里。但这取决于你,如果这在你的情况下是合理的。
发布于 2015-09-14 14:57:17
如果您使用的是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()
获取基本url。
发布于 2015-09-14 16:20:28
如果没有请求,你就不可能知道这一点。您可以使用InetAddress
并解析主机信息,但我猜这不是您想要的。
假设您有两个域www.foo.com和www.bar.com,它们指向正在运行应用程序的主机。在启动时,您没有任何关于这方面的信息,您将不得不执行反向DNS搜索。当您收到请求时,您将得到它来自何处的信息。
您应该根据请求填充链接,这样您就可以摆脱缓存请求范围信息。
https://stackoverflow.com/questions/32567438
复制相似问题