1

我有一个使用 spring 的 java 应用程序,我需要对其进行测试。我正在使用 Jython 2.5.2 和 Eclipse 上安装的 Springpython 1.3.0RC。Java 应用程序使用属性文件 prop.properties 并使用如下注释:

@Value("${csvdatafetcher.filename:input.csv}")

属性文件是:core.filedatafetcher.filename=test.csv

我正在尝试调用应用程序:

from springpython.context import ApplicationContext
from springpython.config import SpringJavaConfig
ctx = ApplicationContext(SpringJavaConfig("javaBeans.xml"))
service = ctx.get_object("csvDataFetcher")

使用弹簧 xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans">
....

    <bean id="props" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <value>classpath:classpath:prop.properties</value>
        </property>
    </bean>

    <bean id="csvDataFetcher" class="com.framework.fetchers.CsvFileDataFetcher" />
</beans>

它给了我错误:

Traceback (most recent call last):
  File "/home/nir/.eclipse/org.eclipse.platform_3.6.1_185596441/plugins/org.python.pydev.debug_2.2.4.2011110216/pysrc/pydevd.py", line 1307, in <module>
    debugger.run(setup['file'], None, None)
  File "/usr/share/jython2.5.2/Lib/site-packages/springpython-1.3.0.RC1-py2.5.egg/springpython/container/__init__.py", line 80, in get_object
    comp = self._create_object(object_def)
  File "/usr/share/jython2.5.2/Lib/site-packages/springpython-1.3.0.RC1-py2.5.egg/springpython/container/__init__.py", line 132, in _create_object
    [prop.set_value(obj, self) for prop in object_def.props if hasattr(prop, "set_value")]
  File "/usr/share/jython2.5.2/Lib/site-packages/springpython-1.3.0.RC1-py2.5.egg/springpython/config/_config_base.py", line 149, in set_value
    setattr(obj, self.name, self.value)
TypeError: can't convert 'classpath:spring-config-test.xml' to org.springframework.core.io.Resource;

或使用(而不是 bean id="props"...):

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

这给了我错误:

Traceback (most recent call last):
  File "/home/nir/.eclipse/org.eclipse.platform_3.6.1_185596441/plugins/org.python.pydev.debug_2.2.4.2011110216/pysrc/pydevd.py", line 1307, in <module>
    debugger.run(setup['file'], None, None)
  File "/usr/share/jython2.5.2/Lib/site-packages/springpython-1.3.0.RC1-py2.5.egg/springpython/container/__init__.py", line 128, in _create_object
    obj = object_def.factory.create_object(self._get_constructors_pos(object_def),
  File "/usr/share/jython2.5.2/Lib/site-packages/springpython-1.3.0.RC1-py2.5.egg/springpython/factory/__init__.py", line 31, in create_object
    parts = self.module_and_class.split(".")
AttributeError: 'NoneType' object has no attribute 'split'
  1. 如何将java属性占位符转换为python spring?
  2. 如何注入连接到注解@Value 的属性?

谢谢,

4

1 回答 1

1

如果您阅读http://static.springsource.org/spring-python/1.2.x/sphinx/html/objects-other-formats.html#springjavaconfig了解更多详细信息,这应该让您更清楚 SpringJavaConfig 和 Spring Python做。一方面,它只支持 Spring 2.5 XML 格式,并且不包含额外的命名空间的东西。它还适用于在 Python 系统中配置 Python 对象,而不是在 Python 系统中配置 Java 对象。这个想法是简单地提供一种从 Java 过渡到 Python 的更顺畅的方式,而无需重写配置文件。

from springpython.config import PythonConfig
from springpython.config import Object
from com.framework.fetchers import CsvFileDataFetcher

class YourAppContext(PythonConfig):
    def __init__(self):
        self.props = {}
        with open("relative/path/to/your/prop.properties") as f:
            for line in f.readlines():
                key, value = line.split("=")
                self.props[key] = value

    @Object
    def csvDataFetcher(self):
        return CsvFileDataFetcher()

使用以下命令访问您的应用程序上下文:

from springpython.context import ApplicationContext
ctx = ApplicationContext(YourAppContext())
service = ctx.get_object("csvDataFetcher")

从这里开始,您可以参考 ctx.props 来访问 prop 值。请注意,Spring Python 没有自动装配,因此属性不会自动注入到事物中。但是使用纯 Python 代码解析文件非常容易,并将其很好地放入您的应用程序上下文中,然后可以将其注入到相关对象中。

于 2012-02-09T01:10:16.313 回答