nir
nir

Reputation: 3140

How to use a spring java xml file with Springpython

I have a java application that uses spring, that I need to test. I'm using Jython 2.5.2 with Springpython 1.3.0RC installed on eclipse. the java application uses a properties file prop.properties and uses annotations like:

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

The properties file is: core.filedatafetcher.filename=test.csv

I'm trying to call the application:

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

with spring 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>

and it gives me the error:

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;

or using (instead of bean id="props"...):

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

that gives me the error:

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. How to convert java property-placeholder into python spring?
  2. How can I inject properties that connected to annotation @Value?

Thanks,

Upvotes: 1

Views: 1147

Answers (1)

gregturn
gregturn

Reputation: 2693

If you read http://static.springsource.org/spring-python/1.2.x/sphinx/html/objects-other-formats.html#springjavaconfig for more details, this should give you more clarity of what SpringJavaConfig and Spring Python does. For one thing, it only supports Spring 2.5 XML format, and doesn't include the extra namespace stuff. It is also geared for configuring Python objects in a Python system, not Java objects in a Python system. The idea is to simply provide a smoother way to transition from Java to Python without having to rewrite your configuration files.

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()

Access your app context with this:

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

From here on, you can refer to ctx.props to access the prop values. Pay note, Spring Python doesn't have an autowiring, so properties are not automatically injected into things. But it's pretty easy to parse the file using pure Python code, and have it nicely tucked into your app context, which in turn can be injected into relevant objects.

Upvotes: 1

Related Questions