文档here说:
在DispatcherPortlet初始化时,框架将查找 一个名为[portlet-name] -portlet.xml的文件,位于WEB-INF目录下 您的Web应用程序并创建在那里定义的bean(覆盖 在全局中使用相同名称定义的任何bean的定义 范围)。
如果可以,我使用注释进行配置,因为保持配置和实际代码同步更容易。所以我项目中的[portlet-name] -portlet.xml看起来像这样(这个文件存在maaany time ...每个portlet一个):
<?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]的请求。在some.path.to.a.Class上放一个@ForPortlet(“[portlet-name]”)注释或类似的东西要容易得多,完全忘记这个XML文件。有可能吗? This bug report可能暗示“不”/“尚未”?
感谢OlliS提供的超级有用的提示(非常感谢!)我找到了一种方法。我潜入了OlliS带我进入春天的源头,在花了很长时间弄清楚事情是如何协同工作后,我写了下面的课:
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);
}
}
然后我使用init-param在portlet.xml文件中将此类注册为contextClass,就像OlliS在他的回答中所说的那样。就是这样。不再需要* -portlet.xml文件。只需一个类来配置我的所有portlet。
当然,人们仍然可以改进这个类,使其更灵活,从某个地方读取portlet包而不是常量。也许是一个初始参数。或者可以扫描注释,也许是提到的@ForPortlet注释,这将创建注册多个bean的可能性。但是现在我很高兴: - )。
答案 0 :(得分:3)
您是否尝试过使用@Configuration带注释的类进行配置?它是Spring框架中3.0版本的一个特性
请参阅此处的参考文档:
http://static.springsource.org/spring/docs/3.0.x/reference/beans.html#beans-java
例如上下文:组件扫描可以被提取:
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.scan("com.acme");
基于Java的配置也可以与XML结合使用;在文档中提到。
希望它有所帮助。
修改强> 所以你想要用java类替换portlet特定的上下文。我不确定DispatcherPortlet是否支持java配置。 您可以尝试添加在普通webapps中使用的类似内容:
<portlet>
<portlet-name>portlet</portlet-name>
<portlet-class>org.springframework.web.portlet.DispatcherPortlet</portlet-class>
<init-param>
<!-- Configure DispatcherPortlet to use AnnotationConfigWebApplicationContext
instead of the default XmlPortletApplicationContext ? -->
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.acme.web.PortletConfig</param-value>
</init-param>
<!-- ... -->
</portlet>
有关AnnotationConfigWebApplicationContext的一些文档: http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/context/support/AnnotationConfigWebApplicationContext.html
来自portlet参考文档:
DispatcherPortlet初始化参数
contextClass
实现WebApplicationContext的类,它将用于实例化 此portlet使用的上下文。如果未指定此参数,则 将使用XmlPortletApplicationContext。
WebApplicationContext的实现可以在文档中找到:
似乎没有特定于portlet的WebApplicationContext实现类,至少我没有找到任何实现类。一个人总是可以做一个:)