如何在Web Servlet中解析Spring @Value批注?

巴尼

我有一个servlet打包在ear文件中,但是我无法获取它来解析@Value注释的属性。

该应用程序分为两部分:包装在war文件中的servlet,然后包含在ear文件中的不同应用程序将其包含在内。该应用程序提供了由Servlet中的接口定义的类(ResourceManager)的实现,还提供了包含@Value带注释字段的属性值的属性文件。

战争文件包含:

web.xml:

<servlet>
  <servlet-class>... extends MessageDispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      classpath:/spring-ws.xml
      classpath:/spring-app.xml
    </param-value>
  </init-param>
</servlet>

spring-ws.xml:

<context:annotation-config/>
<context:property-placeholder location="classpath:/spring-ws.properties"/>

spring-ws.properties中的值直接从spring-ws.xml中引用,并且一切正常。

Servlet类包含:

public class MyServlet extends MessageDispatcherServlet

  @Autowired private ResourceManager resourceManager;  // original annotation - got this to work
  @Value("${app.name:}") private String appName;       // added later - cannot get this to work

app.name是可选的,因此后缀“:”。

ear文件将添加(打包在ear lib目录中的jar文件中):

spring-app.xml:

  <context:property-placeholder location="classpath:/spring-app.properties"/>

  <bean class="ResourceManagerImpl"> 
    ...
  </bean>

spring-app.properties:

app.name=myApp

我的第一个问题是@Autowired注解:不确定我是否正确地了解了这一点,但通过将以下代码添加到servlet中,我设法使其正常工作:

@Override
protected void initFrameworkServlet() throws ServletException {

  AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
  bpp.setBeanFactory(getWebApplicationContext().getAutowireCapableBeanFactory());
  bpp.processInjection(this);
}

这可能不是解决此问题的最佳方法,但这是我发现的第一个方法,并且可以正常工作,因此我继续使用它。然后,我添加了一个@Value带注释的字段,但我找不到使该工作有效的方法。AutowiredAnnotationBeanPostProcessor的javadocs说它也应该处理@Value批注,但它似乎没有:appName属性始终为空(可能是默认值)。

我确实有一种解决方法,使用bean:

@Autowired @Qualifier("appName") private String appName;

<bean id="appName" class="java.lang.String">
  <constructor-arg value="myApp"/>
</bean>

但是我敢肯定,必须有一个更好的方法来做到这一点。我已经读过这篇文章Spring Framework中applicationContext.xml和spring-servlet.xml之间区别,但是我不确定它是否适用:我想我这里甚至没有一个应用程序上下文,只是在该上下文中定义了一个servlet上下文。 (单个)servlet类的web.xml。

我也看到了这一点:Spring 3.0.5不会从properties评估@Value批注,这看起来像是同样的问题,但是解决方案似乎是将“ <context:property-placeholder>”从应用程序中移出。 Servlet上下文的上下文,而正如我之前所说,我什至没有在这里使用应用程序上下文...

最后,我可以快速简化问题,删除单独的应用程序并将所有内容打包在一次大战中,但我不认为这是问题所在(尽管显然可能是错误的……):春天可以解决app.xml文件的类路径,因此它必须能够解析app.properties文件的类路径。

任何帮助都值得赞赏,但是我想在这一点上有点学术上的兴趣,因为我有一个可行的解决方案(使用bean),并且支付账单的人并不真正在乎它是否有效!我只想知道,所以下次我不必复制(我认为是)有缺陷的解决方法。

使用spring-ws-core 2.1.4,它通过maven依赖项引入spring 3.2.4。

谢谢

更新-解决

事实证明,解决此问题的关键是M Deinum的评论“您也有重复的元素...”。我在同一上下文中有两个单独的PropertyPlaceholderConfigurers,因此第二个被忽略,并且其属性从未使用过。上下文本身(这是servlet上下文而不是根上下文)或注释处理都没有问题。

因此,解决方法只是从spring-app.xml中删除属性占位符,然后将两个属性文件合并到spring-ws.xml中

<context:property-placeholder
    location="classpath:/spring-ws.properties,
              classpath:/spring-app.properties"/>

TL; DR在这里的回答Spring:命名空间与contextConfigLocation web.xml中的init参数也是如何处理不同上下文的绝佳解释!

干杯,

然后马库斯

您的Servlet不是Spring托管的Bean,而是由Servlet容器管理的。因此,之所以@Autowired不起作用的原因首先是。Spring只会处理它所知道的bean。

无论是ContextLoaderListener和你的servlet(扩展基本上任何servlet FrameworkServlet)必须有一个自己的实例ApplicationContextContextLoaderListenerservlet中构造的上下文将其中的用作父项。因此ApplicationContext,您的servlet中确实有一个

现在,@Value要正确解决问题,您需要具有PropertyPlaceHolderConfigurer解决占位符的功能。由于PropertyPlaceHolderConfigurer是一个BeanFactoryPostProcessor只工作在同样的情况下豆类,这样一个加载/由配置ContextLoaderListener没有做任何事情对与从你的servlet上下文豆。(因此,您需要将<context:property-placeholder ... />元素添加到Servlet上下文中)。

通常,您也有一个重复元素,您想避免这种情况,因为它会同时导致问题,要么一个覆盖另一个,要么会得到一个例外,即占位符不能由任一占位符解析。 PropertyPlaceHolderConfigurer

您的初始化代码也过于复杂,您不需要AutowiredAnnotationBeanPostProcessor简单地使用可用方法。

getWebApplicationContext().getAutowireCapableBeanFactory().autowireBean(this);

这也比仅AutowiredAnnotationBeanPostProcessor做的要多。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Web Servlet中解析Spring @Value批注?

来自分类Dev

如何在类级变量中使用Spring @Value批注

来自分类Dev

如何在Spring @Value批注中正确指定默认值?

来自分类Dev

JavaPoet:如何在批注中构建批注

来自分类Dev

如何在Spring MVC中解析org.springframework.web.servlet.view.InternalResourceViewResolver

来自分类Dev

java-Spring @Value批注返回null

来自分类Dev

在Spring Starter类中使用@Value批注

来自分类Dev

Spring @Value批注和Setter注入差异

来自分类Dev

如何在Matplotlib批注中显示矩阵

来自分类Dev

如何在Matplotlib批注中显示矩阵

来自分类Dev

Restful Web服务中的Spring @RequestBody批注

来自分类Dev

如何在@SlingServlet批注中调用使用“ resourceType”而不是“ paths”的Sling Servlet

来自分类Dev

Spring @Bean实例化取决于@Value批注

来自分类Dev

获取Spring @Value批注与Grails一起使用

来自分类Dev

如何使用spring @Lookup批注?

来自分类Dev

如何在Web XML中配置Servlet

来自分类Dev

带有PropertyPlaceholderConfigurer Bean的Spring @Configuration文件无法解析@Value批注

来自分类Dev

如何在Eclipse中更改批注中数组的格式?

来自分类Dev

如何在批注中获取值other属性

来自分类Dev

如何在可选闭包中添加@noescape批注

来自分类Dev

如何在IntelliJ IDEa中添加@Contract批注?

来自分类Dev

如何在Xcode中更改PDFView批注背景色?

来自分类Dev

如何在Play框架中获取@Assisted批注

来自分类Dev

如何在swagger php api批注中传递可选参数?

来自分类Dev

如何解析泛型的Java批注?

来自分类Dev

在Spring 3中如何做@CrossOrigin批注?

来自分类Dev

如何使用批注在Spring Batch中运行多个作业

来自分类Dev

在Spring中以编程方式解析AliasFor批注值

来自分类Dev

@Index批注在JPA 2.1中如何工作?

Related 相关文章

  1. 1

    如何在Web Servlet中解析Spring @Value批注?

  2. 2

    如何在类级变量中使用Spring @Value批注

  3. 3

    如何在Spring @Value批注中正确指定默认值?

  4. 4

    JavaPoet:如何在批注中构建批注

  5. 5

    如何在Spring MVC中解析org.springframework.web.servlet.view.InternalResourceViewResolver

  6. 6

    java-Spring @Value批注返回null

  7. 7

    在Spring Starter类中使用@Value批注

  8. 8

    Spring @Value批注和Setter注入差异

  9. 9

    如何在Matplotlib批注中显示矩阵

  10. 10

    如何在Matplotlib批注中显示矩阵

  11. 11

    Restful Web服务中的Spring @RequestBody批注

  12. 12

    如何在@SlingServlet批注中调用使用“ resourceType”而不是“ paths”的Sling Servlet

  13. 13

    Spring @Bean实例化取决于@Value批注

  14. 14

    获取Spring @Value批注与Grails一起使用

  15. 15

    如何使用spring @Lookup批注?

  16. 16

    如何在Web XML中配置Servlet

  17. 17

    带有PropertyPlaceholderConfigurer Bean的Spring @Configuration文件无法解析@Value批注

  18. 18

    如何在Eclipse中更改批注中数组的格式?

  19. 19

    如何在批注中获取值other属性

  20. 20

    如何在可选闭包中添加@noescape批注

  21. 21

    如何在IntelliJ IDEa中添加@Contract批注?

  22. 22

    如何在Xcode中更改PDFView批注背景色?

  23. 23

    如何在Play框架中获取@Assisted批注

  24. 24

    如何在swagger php api批注中传递可选参数?

  25. 25

    如何解析泛型的Java批注?

  26. 26

    在Spring 3中如何做@CrossOrigin批注?

  27. 27

    如何使用批注在Spring Batch中运行多个作业

  28. 28

    在Spring中以编程方式解析AliasFor批注值

  29. 29

    @Index批注在JPA 2.1中如何工作?

热门标签

归档