Таблица БД доступа Liferay в теме: не определен bean-компонент с именем com.colors.themes.service.ColorLocalService
У меня есть тематический проект в LifeRay. Я создал новую таблицу под названием colors в моей базе данных Myray Liferay. Таблица цветов приведена ниже
На самом деле у меня есть требование, чтобы определенный файл CSS был загружен в тему на основе значения таблицы цветов, статус которого равен true, и мой шаблон скорости должен быть примерно таким, как показано ниже
#set ($myColorService = $serviceLocator.findService("com.colors.themes.service.ColorLocalService"))
#set ($myColor = $myColorService.fetchActiveColor())
#if ($myColor == "blue")
<link href="$css_folder/themes/blue.css" rel="stylesheet" type="text/css"/>
#elseif ($myColor == "orange")
<link href="$css_folder/themes/orange.css" rel="stylesheet" type="text/css"/>
#else
<link href="$css_folder/themes/green.css" rel="stylesheet" type="text/css"/>
Следующие вещи - кое-что, что я сделал до сих пор
Я создал проект построителя сервисов (theme_service-portlet) для таблицы цветов. Service.xml показан ниже
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE service-builder PUBLIC "-//Liferay//DTD Service Builder 6.2.0//EN" "http://www.liferay.com/dtd/liferay-service-builder_6_2_0.dtd"> <service-builder package-path="com.colors.themes"> <author>user</author> <namespace>theme</namespace> <entity name="Colors" local-service="true" remote-service="true"> <column name="colorId" type="long" primary="true" /> <column name="colorName" type="String" /> <column name="status" type="boolean" /> <finder return-type="Collection" name="Colors"> <finder-column name="status" /> </finder> </entity> </service-builder>
Построил сервис и банку (
theme_service-portlet-service.jar
) создается в папке lib.- Скопируйте
theme_service-portlet-service.jar
и помещен подliferay-portal-6.2-ce-ga2\tomcat-7.0.42\lib\ext
папка. - В
portal_normal.vm
Я использовал следующий код:
#set ($myColorService = $serviceLocator.findService("com.colors.themes.service.ColorLocalService")) #set ($myColor = $myColorService.fetchActiveColor()) #if ($myColor == "blue") <link href="$css_folder/themes/blue.css" rel="stylesheet" type="text/css"/> #elseif ($myColor == "orange") <link href="$css_folder/themes/orange.css" rel="stylesheet" type="text/css"/> #else <link href="$css_folder/themes/green.css" rel="stylesheet" type="text/css"/>
- Перезапустил сервер Tomcat
Но я получаю следующее исключение
04:44:55,896 ERROR [http-bio-8080-exec-3][ServiceLocator:39] com.liferay.portal.kernel.bean.BeanLocatorException: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'com.colors.themes.service.ColorLocalService' is defined
com.liferay.portal.kernel.bean.BeanLocatorException: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'com.colors.themes.service.ColorLocalService' is defined
at com.liferay.portal.bean.BeanLocatorImpl.locate(BeanLocatorImpl.java:122)
at com.liferay.portal.kernel.bean.PortalBeanLocatorUtil.locate(PortalBeanLocatorUtil.java:98)
at com.liferay.portal.template.ServiceLocator.findService(ServiceLocator.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.doInvoke(UberspectImpl.java:389)
at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.invoke(UberspectImpl.java:378)
at org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:270)
at org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTReference.java:262)
at org.apache.velocity.runtime.parser.node.ASTReference.value(ASTReference.java:507)
at org.apache.velocity.runtime.parser.node.ASTExpression.value(ASTExpression.java:71)
at org.apache.velocity.runtime.parser.node.ASTSetDirective.render(ASTSetDirective.java:142)
at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:336)
at org.apache.velocity.Template.merge(Template.java:328)
Может кто-нибудь, пожалуйста, скажите мне какое-то решение для этого
2 ответа
Прежде всего, у вас есть слой ServiceBuilder, который предоставляет ваш уровень доступа к данным; эта часть хороша.
Ваш код для темы в основном правильный. Вы должны использовать ServiceLocator, чтобы найти свой сервис, но вам не хватает контекста сервлета, который предоставляет сервис. Например, если плагин, предоставляющий сервис, находится в color-service-portlet.war, то вызов локатора сервиса будет выглядеть так:
#set ($myColorService = $serviceLocator.findService("color-service-portlet", "com.colors.themes.service.ColorLocalService"))
Исключение, которое вы видите, заключается в том, что вы используете форму портала для поиска службы портала, но, разумеется, портал не экспортирует эту службу, поэтому вы получаете исключение BeanLocatorException.
Вам нужно включить доступ к сервисам со скорости.
Чтобы включить это, отредактируйте значение journal.template.velocity.restricted.variables в portal-ext.properties.
Как это
journal.template.velocity.restricted.variables=