On Thu, Aug 21, 2008 at 7:40 PM, Andrei Ivanov <[EMAIL PROTECTED]> wrote: > Hello, > I'm having a difficult problem for which I hope someone here can help me.. > The short story: the parameters interceptor is unable to set a parameter. > These are the classes involved: > > package model; > public class Language extends org.apache.commons.lang.enums.Enum { > protected Language(String name) { > super(name); > } > } > > public interface IPreference { > public <T extends model.Language> T getLanguage(); > } > > package project.model; > public class Language extends model.Language { > public static final Language ENGLISH = new Language("en"); > public static final Language RUSSIAN = new Language("ru"); > } > > public class Preference implements IPreference { > public project.model.Language getLanguage() { > return language; > } > > public void setLanguage(project.model.Language language) { > this.language = language; > } > } > > The choice of this hierarchy is to allow to have the first 2 classes > in separate, generic and reusable bundle and the next 2 classes > specific to a project. > > In the interface I'm using <T extends model.Language> T in the > interface to avoid the need to cast the result of the method to a > specific implementation and let the compiler use type inference to do > it for me(and I think this is were the root of the problem is). > > I'm trying to use Preference inside an action and allow a user to > choose the preferred language by sending a form parameter: > preference.language > > The custom converter does it's job and converts 'en' to > project.model.Language.ENGLISH > > The problem is that the parameters interceptor, through ognl, cannot > find the setter for the type project.model.Language > I've looked at the ognl sources and found that it is using > introspection to find the properties of Preference. > The introspector, trying to create a list of the properties, obtains a > list of all methods of the class that respect the JavaBeans spec. > The problem is that the compiler generates a second method inside Preference: > public volatile model.Language getLanguage() { > return getLanguage(); > } > The introspector sees first the method written by me in the source and > then the generated method, which overrides my method. > After that, it find the setter, but the setter doesn't match the type > returned by this second getter, so it ignores it. > Now ognl will throw an exception saying it cannot set the value on a > private field, because it doesn't find the setter. > I've tried adding a second setter for the base Language class, and > introspection finds it but now the converter isn't working because it > cannot work with the base Language class. > > I've tried creating a PreferenceBeanInfo class, but it doesn't seem > right to *manually* create a list of property descriptors that can get > of of sync when Preference changes. > > Any ideas on how to resolve this problem? > I know this is really an ognl problem, but ognl seems abandoned... >
Just for the record, ognl 2.7.3-snapshot seems to work fine with this. I hope the ognl devs will find the time to make a release. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]