Support Category List

处理模板时发生错误。
Java method "com.sun.proxy.$Proxy1096.getLatestArticle(long)" threw an exception when invoked on com.sun.proxy.$Proxy1096 object "com.liferay.journal.service.impl.JournalArticleLocalServiceImpl@70be827c"; see cause exception in the Java stack trace.

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #assign journalArticle = journalArtic...  [in template "14906499#14906838#3379185" at line 179, column 13]
----
1<!-- Start of Global Variables--> 
2<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")> 
3<#assign saxReaderService = serviceLocator.findService("com.liferay.portal.kernel.xml.SAXReader")> 
4<#assign validator = staticUtil["com.liferay.portal.kernel.util.Validator"]> 
5<#assign serviceContextThreadLocal = staticUtil["com.liferay.portal.kernel.service.ServiceContextThreadLocal"]> 
6<#assign serviceContext = serviceContextThreadLocal.getServiceContext()> 
7<#assign httpServletRequest = serviceContext.getRequest()> 
8 
9<#if httpServletRequest.getParameterValues('productFeatureKeys')?has_content> 
10    <#assign productFeatureKeys = httpServletRequest.getParameterValues('productFeatureKeys')> 
11<#else> 
12    <#assign productFeatureKeys = ""> 
13</#if> 
14<#if productFeatureKeys?has_content> 
15    <#list productFeatureKeys as productFeatureKey> 
16        <#assign productFeatureKeyList = productFeatureKey/> 
17    </#list> 
18</#if> 
19 
20<#if httpServletRequest.getParameter('productKey')?has_content> 
21    <#assign productKey = httpServletRequest.getParameter('productKey')?string> 
22<#else> 
23    <#assign productKey = ""> 
24</#if> 
25 
26<#if httpServletRequest.getParameter('channel')?has_content> 
27    <#assign channel = httpServletRequest.getParameter('channel')?string> 
28<#else> 
29    <#assign channel = ""> 
30</#if> 
31 
32<#if httpServletRequest.getParameter('locale')?has_content> 
33    <#assign curr_locale = httpServletRequest.getParameter('locale')?string> 
34<#else> 
35    <#assign curr_locale = ""> 
36</#if> 
37 
38<#if httpServletRequest.getParameter('trackingId')?has_content> 
39    <#assign tracking_id = httpServletRequest.getParameter('trackingId')?string> 
40<#else> 
41    <#assign tracking_id = ""> 
42</#if> 
43<!-- End of Global Variables--> 
44 
45<!DOCTYPE html> 
46<html> 
47<head> 
48<meta name="viewport" content="width=device-width, initial-scale=1"> 
49<!-- Start of Category List Template Style--> 
50<style type="text/css"> 
51    .sidenav-content { 
52        position: relative !important; 
53        padding-left: 0px !important; 
54        overflow-x: hidden !important; 
55
56    .panel-title { 
57        margin-bottom: 2%; 
58
59    .panel { 
60        margin-bottom: 0%; 
61
62    .panel-default { 
63        border-radius: 0; 
64        border-left: none; 
65        border-right: none; 
66        border-bottom: none; 
67        margin-bottom: 0%; 
68
69    .panel-default .panel-heading { 
70        background-color: white; 
71
72    .panel-default .panel-body { 
73        border-top: 1px solid #D8D8D8; 
74        background-color: #F7F7F7; 
75        border-left: none; 
76        border-right: none; 
77        border-bottom: none; 
78
79    .hide-accessible, .quick-access-nav li { 
80        display: none; 
81
82    a:hover { 
83        text-decoration: none; 
84
85    .ltr { 
86        margin-top: -4%; 
87
88    .control-menu { 
89        display: none; 
90
91    .sidenav-menu-slider { 
92        display: none; 
93
94    .breadcrumb { 
95        display: none; 
96
97    #breadcrumbs { 
98        display: none; 
99
100    .autofit-float { 
101        display: none; 
102
103    .control-menu { 
104        display: none; 
105
106    .control-menu { 
107        display: none; 
108
109    #navbar-custom { 
110        display: none; 
111
112    ::-webkit-scrollbar { 
113        display:none; 
114        width: 0px; 
115
116    .portlet { 
117        margin-bottom: 0px; 
118
119    <#if channel == "" || channel == "ios"> 
120        .accordion-question { 
121            padding-left: 26px; 
122
123        .panel-heading .accordion-toggle.collapsed:before { 
124            /* symbol for "collapsed" panels */ 
125            font-family: 'Glyphicons Halflings'; 
126            content: url(/documents/14906834/15019881/Right-7%401x.svg/f2caa825-48ec-4183-c2b0-9eb79fd56501?t=1618489554550); 
127            padding-right: 23px; 
128            font-size: 20px; 
129            color: grey; 
130            margin-top: -6px; 
131            float:right; 
132
133   <#else> 
134        .accordion-question { 
135            padding-left: 16px; 
136
137        .panel-heading .accordion-toggle.collapsed:before { 
138            /* symbol for "collapsed" panels */ 
139            font-family: 'Glyphicons Halflings'; 
140            content: url(/documents/14906834/15019878/arrow-right%401x.svg/d5632928-7d22-f6cc-336e-288deb0088ed?t=1618489234673); 
141            padding-right: 20px; 
142            font-size: 20px; 
143            color: grey; 
144            margin-top: -5px; 
145            float:right; 
146
147   </#if> 
148    .accordion-question { 
149        padding-top: 20px; 
150        padding-bottom: 10px; 
151
152    .accordion-question p { 
153        color: #424242; 
154        font-size: 16px; 
155        letter-spacing: 0; 
156        line-height: 22px; 
157        margin-bottom: 0%; 
158        padding-right: 61px 
159
160    .portlet { 
161        margin-bottom: 0px; 
162
163</style> 
164<!-- End of Category List Template Style--> 
165</head> 
166<body> 
167<!-- Google Tag Manager (noscript) --> 
168<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-K9WGFNX" 
169    height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 
170<!-- End Google Tag Manager (noscript) --> 
171 
172<!-- Start of Category List creation--> 
173<#if Category.getSiblings()?has_content> 
174    <#list Category.getSiblings() as cur_Category> 
175        <#assign webContentData = jsonFactoryUtil.createJSONObject(cur_Category.getData())/> 
176        <#if webContentData.classPK?has_content> 
177            <#assign resourcePrimaryKey = webContentData.classPK?number/> 
178            <#assign categoryValue = ""/> 
179            <#assign journalArticle = journalArticleLocalService.getLatestArticle(resourcePrimaryKey)/> 
180            <#if curr_locale = ""> 
181                <#assign currentLocale = themeDisplay.getLocale()/> 
182            <#else> 
183                <#assign currentLocale = curr_locale/> 
184            </#if> 
185            <#assign categoryValue = journalArticle.getTitle(currentLocale)/> 
186        </#if> 
187        <#if productFeatureKeys?has_content && cur_Category.ProductFeature.getData()?has_content && cur_Category.ProductFeature.getData()?string!="na" > 
188            <#list productFeatureKeyList?split(r'\s*,\s*', 'r') as productFeatureKey> 
189                <#if productFeatureKey!= "" && cur_Category.ProductFeature.getData()?number==productFeatureKey?number> 
190                    <#if categoryValue == "" || !(categoryValue?has_content)> 
191                        <#assign categoryValue = webContentData.title/> 
192                    </#if> 
193                <!-- Start of accordion display creation--> 
194                    <div class="panel panel-default hidden"> 
195                        <div class="panel-heading"> 
196                            <h4 class="panel-title"> 
197                                <div class=accordion-question> 
198                                    <a class="accordion-toggle collapsed" data-toggle="collapse" data-parent="#accordion" onclick="redirectFAQ('${cur_Category.PageURL.getData()}','${curr_locale}','${channel}','${productKey}','${categoryValue}','${webContentData.title}')"> 
199                                        <p>${categoryValue}</p> 
200                                    </a> 
201                                </div> 
202                            </h4> 
203                        </div> 
204                    </div> 
205                </#if> 
206            </#list> 
207        <#elseif cur_Category.ProductFeature.getData()?string="" || cur_Category.ProductFeature.getData()?string=="na"> 
208            <!-- Start of accordion display creation--> 
209            <#if categoryValue == "" || !(categoryValue?has_content)> 
210                        <#assign categoryValue = webContentData.title/> 
211            </#if> 
212            <div class="panel panel-default hidden"> 
213                <div class="panel-heading"> 
214                    <h4 class="panel-title"> 
215                        <div class=accordion-question> 
216                            <a class="accordion-toggle collapsed" data-toggle="collapse" data-parent="#accordion" onclick="redirectFAQ('${cur_Category.PageURL.getData()}','${curr_locale}','${channel}','${productKey}','${categoryValue}','${webContentData.title}')"> 
217                                <p>${categoryValue}</p> 
218                            </a> 
219                        </div> 
220                    </h4> 
221                </div> 
222            </div> 
223        </#if> 
224    </#list> 
225</#if> 
226<!-- End of Category List creation--> 
227 
228<!-- Start of Javascript execution--> 
229<script src="https://code.jquery.com/jquery-1.12.4.js"></script> 
230<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> 
231<!-- Global site tag (gtag.js) - Google Analytics --> 
232<script async src="https://www.googletagmanager.com/gtag/js?id=UA-135803603-11"></script> 
233<script> 
234    var trackId = '${tracking_id}'; 
235    window.dataLayer = window.dataLayer || []; 
236    function gtag(){dataLayer.push(arguments);} 
237    gtag('js', new Date()); 
238    gtag('config', 'UA-135803603-11'); 
239    gtag('set', {'user_id': trackId}); 
240</script> 
241<!-- Google Tag Manager --> 
242<script> 
243    (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','GTM-K9WGFNX'); 
244</script> 
245<script> 
246    function redirectFAQ(urlTitle,curr_locale,channel,productKey,categoryName,gaCategoryName){ 
247        var urlPath = urlTitle+'?locale='+curr_locale+'&channel='+channel+'&productKey='+productKey+'&categoryName='+categoryName+'&gaCategoryName='+gaCategoryName; 
248        window.open(urlPath, "_self"); 
249
250    (function($) { 
251        $(window).load(function() { 
252            $('.panel').removeClass('hidden'); 
253        }); 
254    })(jQuery); 
255</script> 
256<!-- End of Javascript execution--> 
257</body> 
258</html>