使用注释删除* -portlet.xml。可能?怎么样?

时间:2011-07-13 18:58:02

标签: spring configuration portlet

文档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的可能性。但是现在我很高兴: - )。

1 个答案:

答案 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的实现可以在文档中找到:

http://static.springsource.org/spring/docs/current/api/org/springframework/web/context/WebApplicationContext.html

似乎没有特定于portlet的WebApplicationContext实现类,至少我没有找到任何实现类。一个人总是可以做一个:)