Spring findet meine Methode nicht und matcht die der Superclass, warum?

DarthShader

Erfahrenes Mitglied
Hallo zusammen,

ich kann Springs Strategie wieder mal nicht nachvollziehen, mit der es Methoden Signaturen matcht:

Ich habe eine Subclass von "JFrame" angelegt und in dieser die Methode

Java:
public void setSize( String size )
{
	// Aufruf der setSize( Dimension ) Methode von JFrame
	setSize( parseSizeString( size ) );
}

erstellt. Die Methode nimmt z.B. "800, 600" entgegen, parst die Zahlen und ruft dann das setSize( Dimension ) von JFrame auf. Dies habe ich gemacht, um meine XML Context Configuration einfacher zu halten, sodas ich jetzt

XML:
<bean id="applicationWindow" class="de.....ApplicationWindow">
	<property name="size" value="800, 600" />
</bean>

verwenden kann. Das funktioniert auch tadellos.

Wenn ich genau dasselbe aber jetzt mit "setMinimumSize" machen möchte, so wirft mir Spring folgende Exception:

Java:
Caused by: java.lang.IllegalArgumentException: Cannot convert value of type [java.lang.String] to required type [java.aw
t.Dimension] for property 'minimumSize': no matching editors or conversion strategy found

Er findet meine überschriebene Methode "setMinimumSize( String )" also anscheinend nicht. Benenne ich die Methode zu "setMinimumSize1" um, klappt es. Aber wieso ist das so? Bei "setSize( String )" funktioniert es doch auch?


Über Eure Hilfe würde ich mich sehr freuen


Vielen Dank!
 
Zuletzt bearbeitet von einem Moderator:
Hallo Tom,

Wenn ich genau dasselbe aber jetzt mit "setMinimumSize" machen möchte

mit setSize klappt es, das habe ich oben als Beispiel geschrieben. Wenn ich, wie gesagt, exakt dasselbe mache, nur statt "setSize" verwende ich "setMinimumSize" (im Code wie auch in der XML) erhalte ich die angegebene Exception.
 
Hallo,

das Problem liegt an einer inkonstistenten Kombination von gettern / settern die die Property Inspection für Spring schwierig macht... (setSize(int,int) setSize(Dimension) vs. Dimension getSize(Dimension), Dimension getSize() ...)

Hier ein alternativer Vorschlag:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">


	<bean name="appWindow" class="de.tutorials.ApplicationWindow">
		<constructor-arg index="0">
			<value>640,480</value>
		</constructor-arg>
		<property name="minimumSize" value="320,240" />
		<property name="title" value="Appwindow" />
	</bean>

	<bean id="customEditorConfigurer"
		class="org.springframework.beans.factory.config.CustomEditorConfigurer">
		<property name="customEditors">
			<map>
				<entry key="java.awt.Dimension">
					<bean class="de.tutorials.spring.properties.DimensionEditor" />
				</entry>
			</map>
		</property>
	</bean>

</beans>

Bootstrap:
Java:
package de.tutorials;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class CustomJFrameViaSpringExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ApplicationContext context = new FileSystemXmlApplicationContext(
				"conf/context.xml");
		ApplicationWindow applicationWindow = (ApplicationWindow) context
				.getBean("appWindow");
		applicationWindow.setVisible(true);
	}
}



Dimension Property Editor:
Java:
package de.tutorials.spring.properties;

import java.awt.Dimension;
import java.beans.PropertyEditorSupport;

public class DimensionEditor extends PropertyEditorSupport {
	@Override
	public void setAsText(String text) throws IllegalArgumentException {
		String[] widthHeight = text.split(",");
		setValue(new Dimension(Integer.parseInt(widthHeight[0]),Integer.parseInt(widthHeight[1])));
	}
}

ApplicationWindow:
Java:
package de.tutorials;

import java.awt.Dimension;

import javax.swing.JFrame;

public class ApplicationWindow extends JFrame{
	public ApplicationWindow(Dimension size){
		setSize(size);
	}
}
Gruß Tom
 
Zuletzt bearbeitet von einem Moderator:
Zurück