Reputation: 3140
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'
Thanks,
Upvotes: 1
Views: 1147
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