[英]How do I find base URL during Spring MVC startup?
潛伏在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,但是據我了解,應用程序在啟動后會收到這些URL,而我從一開始就需要baseUrl。 畢竟,Spring API將HttpServletRequest描述為:“定義一個對象以向Servlet提供客戶端請求信息”,換句話說,是啟動后從客戶端發送的請求。
我當然可以通過在代碼中編寫私有的最終String來添加靜態baseUrl:
private final String BASE_URL = "http://www.fooExample.com/"
但是,如果應用程序的基本URL隨時間變化,最好由Spring MVC自動設置基本URL。 假設我有一個Cache-class,它使用依賴項注入:
@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的包含我所需信息的對象設置了一次。 最有可能的是,它是框架的一部分,是配置類,但是在Internet上搜索了一段時間之后,我最發現的是與HttpServletRequest相關的解決方案。
我真正在尋找什么Spring類/對象和方法? 或者您還需要從頭開始獲取base_url的其他建議嗎?
我需要這個的絕對基本URL,而不是相對的URL。
您的應用程序沒有單個“基本URL”。 考慮一下-您可以訪問生產服務器:
如果您不想或無法反映請求的“基本URL”,我的建議是為每個環境配置一個“規范基本URL”,例如。 在屬性中。 但這取決於您的情況。
如果您使用的是Java config和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。
沒有請求,您將無從得知。 您可以使用InetAddress
並解析主機信息,但是我想這不是您想要的。
假設您有兩個域www.foo.com和www.bar.com指向運行應用程序的主機。 啟動時,您沒有任何信息,則必須進行反向DNS搜索。 收到請求后,您將獲得來自何處的信息。
您應該根據請求填寫鏈接,以便擺脫緩存請求范圍信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.