Документация здесь гласит:
При инициализации DispatcherPortlet платформа будет искать файл с именем [portlet-name] -portlet.xml в WEB-INF каталога вашего веб-приложения и создайте определенные bean-компоненты (переопределяя определения любых bean-компонентов, определенных с тем же именем в глобальной области видимости).
Я выполняю настройку, используя аннотации, если могу,потому что легче поддерживать синхронизацию конфигурации и фактического кода.Итак, этот [portlet-name] -portlet.xml в моем проекте выглядит следующим образом (и этот файл существует раз в год ... Один для каждого портлета):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config />
<bean class="some.path.to.a.Class" />
</beans>
Это много XML только длямаленький кусочек информации: что some.path.to.a.Class должен использоваться для обработки запросов к [portlet-name].Было бы гораздо проще поместить аннотацию @ForPortlet ("[portlet-name]") или что-то в этом роде в some.path.to.a.Class и полностью забыть об этом XML-файле.Возможно ли что-нибудь подобное? Этот отчет об ошибке может намекнуть на "нет" / "еще нет"?
РЕШЕНИЕ
Благодаря супер полезным советам от OlliS (Большое спасибо!) Яразобрался, как это сделать.Я погрузился в моменты, которые OlliS дал мне в источник Spring, и, потратив много времени, чтобы выяснить, как все работает вместе, я написал следующий класс:
public class MyPortletContext extends
AbstractRefreshablePortletApplicationContext
{
private static final String PORTLET_PACKAGE = "package.where.my.portlets.are.";
private static final String REMOVE_FROM_NAMESPACE_FOR_PORTLETNAME = "-portlet";
@Override
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory)
throws BeansException, IOException
{
// The following line does the same thing as specifying
// <context:annotation-config /> in the xml file:
AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);
// Figure out the portlet name:
final String portletName = StringUtils.removeEnd(getNamespace(),
REMOVE_FROM_NAMESPACE_FOR_PORTLETNAME);
// Derive the controller from the portlet name:
final String beanClassName = PORTLET_PACKAGE + portletName;
// Tell spring about the bean:
final GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClassName(beanClassName);
final String beanName = BeanDefinitionReaderUtils.generateBeanName(
beanDefinition, beanFactory);
final BeanDefinitionHolder bdHolder = new BeanDefinitionHolder(
beanDefinition, beanName, new String[] { beanClassName });
BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, beanFactory);
}
}
Затем я зарегистрировал этот класс как contextClass в портлете.XML-файл, использующий init-param, точно так же, как в своем ответе фигурировал OlliS.И это все.Файл * -portlet.xml больше не требуется.Всего один класс, настраивающий все мои портлеты.
Конечно, можно еще улучшить этот класс, сделав его более гибким, считывая пакет портлета откуда-то вместо константы.Может быть, init-param.Или можно искать аннотации, возможно, упомянутую аннотацию @ForPortlet, которая создаст возможность зарегистрировать более одного компонента.Но пока я счастлив: -).