Как использовать Spring Java-файл XML с Springpython - PullRequest
1 голос
/ 08 февраля 2012

У меня есть Java-приложение, использующее Spring, которое мне нужно проверить.Я использую Jython 2.5.2 с Springpython 1.3.0RC, установленным на Eclipse.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?
  2. Как добавить свойства, связанные с аннотацией @Value?

Спасибо,

1 Ответ

1 голос
/ 09 февраля 2012

Если вы читаете 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, а не объектов Java в системе Python.Идея состоит в том, чтобы просто обеспечить более плавный способ перехода с 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")

Отсюдаon, вы можете обратиться к ctx.props для доступа к значениям prop.Обратите внимание, что Spring Python не имеет автоматической проводки, поэтому свойства не вводятся автоматически.Но разобрать файл довольно просто, используя чистый код Python, и его можно аккуратно вставить в контекст вашего приложения, который, в свою очередь, может быть вставлен в соответствующие объекты.

...