PDA

View Full Version : puzzling "bean name must not be empty" error



tejunekim
Jul 12th, 2006, 11:27 PM
hello, i was wondering if anyone could help me with this puzzling error. i'm defining a bean in a properties file and a method reads in the properties file like this:


beanReader.loadBeanDefinitions(resource, "config");
param.setLovResolver((LOVResolver)beanFactory.getB ean("config"));


the resource is loaded from following properties file:


config.(class)=sandbox.domain.Config
config.valueClass=java.lang.String


now the error: :eek:


java.lang.IllegalArgumentException: Bean name must not be empty
at org.springframework.util.Assert.hasText(Assert.jav a:169)
at org.springframework.beans.factory.support.DefaultL istableBeanFactory.registerBeanDefinition(DefaultL istableBeanFactory.java:310)
at org.springframework.beans.factory.support.Properti esBeanDefinitionReader.registerBeanDefinition(Prop ertiesBeanDefinitionReader.java:468)
at org.springframework.beans.factory.support.Properti esBeanDefinitionReader.registerBeanDefinitions(Pro pertiesBeanDefinitionReader.java:373)
at org.springframework.beans.factory.support.Properti esBeanDefinitionReader.loadBeanDefinitions(Propert iesBeanDefinitionReader.java:257)
at org.springframework.beans.factory.support.Properti esBeanDefinitionReader.loadBeanDefinitions(Propert iesBeanDefinitionReader.java:221)
at sandbox.service.ReportService.getParameters(Report Service.java:89)
at sandbox.web.ConfigureReportFormController.formBack ingObject(ConfigureReportFormController.java:43)
at org.springframework.web.servlet.mvc.AbstractFormCo ntroller.getErrorsForNewForm(AbstractFormControlle r.java:341)
at org.springframework.web.servlet.mvc.AbstractFormCo ntroller.showNewForm(AbstractFormController.java:3 22)
at org.springframework.web.servlet.mvc.AbstractFormCo ntroller.handleRequestInternal(AbstractFormControl ler.java:262)
at org.springframework.web.servlet.mvc.AbstractContro ller.handleRequest(AbstractController.java:153)
at org.springframework.web.servlet.mvc.SimpleControll erHandlerAdapter.handle(SimpleControllerHandlerAda pter.java:44)
at org.springframework.web.servlet.DispatcherServlet. doDispatch(DispatcherServlet.java:723)
at org.springframework.web.servlet.DispatcherServlet. doService(DispatcherServlet.java:663)
at org.springframework.web.servlet.FrameworkServlet.p rocessRequest(FrameworkServlet.java:394)
at org.springframework.web.servlet.FrameworkServlet.d oGet(FrameworkServlet.java:348)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:802)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invo ke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invo ke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke( StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invok e(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.servic e(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(H ttp11Processor.java:856)
at org.apache.coyote.http11.Http11Protocol$Http11Conn ectionHandler.processConnection(Http11Protocol.jav a:744)
at org.apache.tomcat.util.net.PoolTcpEndpoint.process Socket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThr ead.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlR unnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source)


as for versions, i'm using spring 1.2.8, java 1.4, tomcat 5.5, and other libraries are dependencies from spring 1.2.8 release.

i've had another app in spring rich client do extremely similar thing and that worked... please help me out. :confused:

Marten Deinum
Jul 13th, 2006, 02:06 AM
try



beanReader.loadBeanDefinitions(resource);
param.setLovResolver((LOVResolver)beanFactory.getB ean("config"));


The properties file is parsed with this method (from PropertiesBeanDefinitionReader).


/**
* Register bean definitions contained in a Map.
* Ignore ineligible properties.
* @param map Map name -> property (String or Object). Property values
* will be strings if coming from a Properties file etc. Property names
* (keys) <b>must</b> be strings. Class keys must be Strings.
* @param prefix match or filter within the keys in the map: e.g. 'beans.'
* (can be empty or <code>null</code>)
* @param resourceDescription description of the resource that the Map came from
* (for logging purposes)
* @return the number of bean definitions found
* @throws BeansException in case of loading or parsing errors
* @see #registerBeanDefinitions(Map, String)
*/
public int registerBeanDefinitions(Map map, String prefix, String resourceDescription)
throws BeansException {

if (prefix == null) {
prefix = "";
}
int beanCount = 0;

for (Iterator it = map.keySet().iterator(); it.hasNext();) {
Object key = it.next();
if (!(key instanceof String)) {
throw new IllegalArgumentException("Illegal key [" + key + "]: only Strings allowed");
}
String keyString = (String) key;
if (keyString.startsWith(prefix)) {
// Key is of form: prefix<name>.property
String nameAndProperty = keyString.substring(prefix.length());
// Find dot before property name, ignoring dots in property keys.
int sepIdx = -1;
int propKeyIdx = nameAndProperty.indexOf(PropertyAccessor.PROPERTY_ KEY_PREFIX);
if (propKeyIdx != -1) {
sepIdx = nameAndProperty.lastIndexOf(SEPARATOR, propKeyIdx);
}
else {
sepIdx = nameAndProperty.lastIndexOf(SEPARATOR);
}
if (sepIdx != -1) {
String beanName = nameAndProperty.substring(0, sepIdx);
if (logger.isDebugEnabled()) {
logger.debug("Found bean name '" + beanName + "'");
}
if (!getBeanFactory().containsBeanDefinition(beanName )) {
// If we haven't already registered it...
registerBeanDefinition(beanName, map, prefix + beanName, resourceDescription);
++beanCount;
}
}
else {
// Ignore it: It wasn't a valid bean name and property,
// although it did start with the required prefix.
if (logger.isDebugEnabled()) {
logger.debug("Invalid bean name and property [" + nameAndProperty + "]");
}
}
}
}

return beanCount;
}


So it is checking for properties starting with prefix, stripping the prefix, letting only the .(class) reside, which leaves a bean definition without a beanname.

tejunekim
Jul 13th, 2006, 07:42 AM
thanks for the quick response. it worked! :) although, i've gotta wonder, why the same lines of code worked in my spring rich client app and not here. perhaps the slight version difference... anyway thank you!