使用 Liferay 的注册钩子编译 OSGi 包

问题描述 投票:0回答:1

我正在尝试使用 Apache Maven 为 Liferay 7.4.3 制作可配置的日志应用程序。当将项目编译为 OSGi 包(使用 bnd-maven-plugin)时,我可以使用这种方法使应用程序可配置。

但是我需要在 webapp/WEB-INF/liferay-hook.xml 中注册钩子,例如:

<?xml version="1.0"?>
<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 7.1.0//EN" "http://www.liferay.com/dtd/liferay-hook_7_1_0.dtd">

<hook>
    <servlet-filter>
        <servlet-filter-name>My Hook</servlet-filter-name>
        <servlet-filter-impl>MyHook</servlet-filter-impl>
    </servlet-filter>
    <servlet-filter-mapping>
        <servlet-filter-name>My Hook</servlet-filter-name>
        <before-filter>SSO Open SSO Filter</before-filter>
        <url-pattern>/*</url-pattern>
    </servlet-filter-mapping>
</hook>

有没有办法将钩子和可配置应用程序合并到单个应用程序中?即以在 webapp/WEB-INF/liferay-hook.xml 中包含钩子注册的方式编译 OSGi 包?

我有一个使用该方法的带有钩子的应用程序的工作实现,但是它被编译为 WAR 以包含 WEB-INF 文件夹。

我尝试使用 bnd-maven-plugin 和 maven-bundle-plugin 将应用程序编译为 WAB,但没有成功。

java maven liferay liferay-7 wab
1个回答
0
投票

不需要 6.x 风格的钩子。您可以按照此示例实现 Servlet 过滤器:

@Component(
        immediate = true,
        property = {

// To figure out valid values for before-filter, look up Liferay's
// WEB-INF/liferay-web.xml

                "before-filter=Auto Login Filter",
                "dispatcher=REQUEST",
//              "dispatcher=FORWARD",
//              "dispatcher=ASYNC",
//              "dispatcher=ERROR",
//              "dispatcher=INCLUDE",
                "servlet-context-name=",

                // Pick your own unique filter name! Make sure to pick a
                // different one for every filter you write - see LPS-107575

                "servlet-filter-name=Blade Servlet Filter",
                "url-pattern=/web/*",
                "url-pattern=/change/me"
        },
        service = Filter.class
)
public class BladeServletFilter extends BaseFilter {

    @Override
    protected Log getLog() {
        return _log;
    }

    @Override
    protected void processFilter(
            HttpServletRequest httpServletRequest,
            HttpServletResponse httpServletResponse, FilterChain filterChain)
        throws Exception {

        // implement your own logic here
        // determine if you shortcut, or continue in the filter chain

        httpServletResponse.addHeader(
            "X-Blade-Servlet-Filter", httpServletRequest.getRequestURI());

        processFilter(
            BladeServletFilter.class.getName(), httpServletRequest,
            httpServletResponse, filterChain);
    }

    private static final Log _log = LogFactoryUtil.getLog(
        BladeServletFilter.class);

}
© www.soinside.com 2019 - 2024. All rights reserved.