在Web应用程序的@Controllers
中,您可以自动装配您的Servlet上下文,这样您就可以(在我的情况下)从Web应用程序中获取Manifest(请参阅https://stackoverflow.com/a/615545/1019307)。
@Autowired
ServletContext servletContext;
你如何将这项服务纳入服务?
我实现了这个简单的模式并且认为我会分享。
答案 0 :(得分:0)
更新:这是一个糟糕的解决方案,因为它使服务依赖于客户端。请参阅下面的更新解决方案。
只需使用@PostConstruct
,以便服务在运行之前设置ServletContext。
@Controller
@RequestMapping("/manifests")
public class ManifestEndpoint {
@Autowired
private ManifestService manifestService;
@Autowired
ServletContext servletContext;
@PostConstruct
public void initService() {
manifestService.setServletContext(servletContext);
}
然后在服务中一定要检查它是否已被使用,因为无法保证。
@Component
public class ManifestService {
....
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
private void buildManifestCurrentWebApp() {
if (servletContext == null) {
throw new RuntimeException("ServletContext not set");
}
# Here's how to complete my example on how to get WebApp Manifest
try {
URL thisAppsManifestURL = servletContext.getResource("/META-INF/MANIFEST.MF");
System.out.println("buildManifestCurrentWebApp - url: "+thisAppsManifestURL);
buildManifest(thisAppsManifestURL);
} catch (MalformedURLException e) {
e.printStackTrace();
}
更新的解决方案不会使服务依赖于客户端。
@Controller
@RequestMapping("/manifests")
public class ManifestEndpoint {
private static final Logger logger = LoggerFactory.logger(ManifestEndpoint.class);
@Autowired
private ManifestService manifestService;
@Autowired
private ServletContext servletContext;
@PostConstruct
public void initService() {
// We need to use the Manifest from this web app.
URL thisAppsManifestURL;
try {
thisAppsManifestURL = servletContext.getResource("/META-INF/MANIFEST.MF");
} catch (MalformedURLException e) {
throw new GeodesyRuntimeException("Error retrieving META-INF/MANIFEST.MF resource from webapp", e);
}
manifestService.buildManifest(thisAppsManifestURL);
}
ManifestService没有改变(也就是说,现在不需要buildManifestCurrentWebApp())。