Spring - 如何将ServletContext转换为@Service(+如何获取WebApps Manifest)

时间:2016-05-27 05:55:19

标签: java spring servlets manifest

在Web应用程序的@Controllers中,您可以自动装配您的Servlet上下文,这样您就可以(在我的情况下)从Web应用程序中获取Manifest(请参阅https://stackoverflow.com/a/615545/1019307)。

@Autowired
ServletContext servletContext;

你如何将这项服务纳入服务?

我实现了这个简单的模式并且认为我会分享。

1 个答案:

答案 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())。