我希望能够动态检索我的春季网站的“ servlet上下文路径”(例如http://localhost/myapp
或http://www.mysite.com
)来自服务spring bean 的应用程序。
这样做的原因是我想在将要发送给网站用户的电子邮件中使用此值。
虽然从Spring MVC控制器执行此操作非常容易,但从Service bean执行此操作并不是那么明显。
有人可以提供建议吗?
编辑:附加要求:
我想知道是否有在应用程序启动时检索上下文路径的方法并且可以通过我的所有服务随时检索它?
答案 0 :(得分:37)
如果使用ServletContainer> = 2.5,则可以使用以下代码获取ContextPath:
import javax.servlet.ServletContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component
@Component
public class SpringBean {
@Autowired
private ServletContext servletContext;
@PostConstruct
public void showIt() {
System.out.println(servletContext.getContextPath());
}
}
答案 1 :(得分:22)
正如安德烈亚斯建议的那样,你可以使用ServletContext。我像这样使用它来获取我的组件中的属性:
<RootElement>
<MandatoryElement> ... </MandatoryElement>
<OptionalElement> ... </OptionalElement>
<AnotherElement> ... </AnotherElement>
</RootElement>
答案 2 :(得分:6)
我会避免从服务层创建对Web图层的依赖关系。让控制器使用request.getRequestURL()
解析路径并将其直接传递给服务:
String path = request.getRequestURL().toString();
myService.doSomethingIncludingEmail(..., path, ...);
答案 3 :(得分:1)
如果服务是由控制器触发的,我假设它是你可以从控制器使用HttpSerlvetRequest检索路径并将完整路径传递给服务。
如果它是UI流程的一部分,你实际上可以在HttpServletRequest
中注入任何层,它可以工作,因为如果你注入HttpServletRequest
,Spring实际上会注入一个委托给实际的HttpServletRequest的代理(通过在ThreadLocal
中保留引用。)
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
public class AServiceImpl implements AService{
@Autowired private HttpServletRequest httpServletRequest;
public String getAttribute(String name) {
return (String)this.httpServletRequest.getAttribute(name);
}
}
答案 4 :(得分:0)
使用 Spring Boot,您可以在 application.properties
中配置上下文路径:
server.servlet.context-path=/api
然后您可以像这样从 Service
或 Controller
获取路径:
import org.springframework.beans.factory.annotation.Value;
@Value("${server.servlet.context-path}")
private String contextPath;