Wicket 是否可以在PropertyModel的表达式中传递参数?

Wicket 是否可以在PropertyModel的表达式中传递参数?,wicket,wicket-6,Wicket,Wicket 6,我有一个模型对象,它有一个接受字符串的getter/setter public String getStringValue(String key) 我需要知道是否可以将该getter与PropertyModel一起使用,如果可以,我该怎么做?示例可能如下所示: new PropertyModel<String>(myObj, "StringValue[key]"); newpropertyModel(myObj,“StringValue[key]”); 没有内置的方法可以做到这一

我有一个模型对象,它有一个接受
字符串的getter/setter

public String getStringValue(String key)
我需要知道是否可以将该getter与
PropertyModel
一起使用,如果可以,我该怎么做?示例可能如下所示:

new PropertyModel<String>(myObj, "StringValue[key]");
newpropertyModel(myObj,“StringValue[key]”);

没有内置的方法可以做到这一点。但您可以定义自己的Wicket模型,通过反射来实现。 例如:

public class FunctionReflectionReadOnlyModel<T, R> extends AbstractReadOnlyModel<T> {

    private Object object;
    private String functionName;
    private R key;
    private Class<R> keyClass;

    public FunctionReflectionReadOnlyModel(Object object, String expression, Class<R> keyClass) {
        this.object = object;
        this.functionName = getFunctionName(expression);
        this.key = getKey(expression);
        this.keyClass = keyClass;
    }

    @Override
    public T getObject() {
        try {
            Method method = object.getClass().getMethod(functionName, keyClass);
            return (T)method.invoke(object, key);
        } catch (Exception ex) {
            //process exception
            return null;
        }
    }
}

我读到仅限使用的PropertyModel已经太晚了。在这种情况下,您可以从PropertyModel继承类并更改getModel/setModel,如示例函数ReflectionReadOnlyModel中所示。所以您不需要更改其他API类。但是,如果您想要PropertyModel(嵌套对象)的所有功能,您需要实现它。

没有内置的方法来实现它。但您可以定义自己的Wicket模型,通过反射来实现。 例如:

public class FunctionReflectionReadOnlyModel<T, R> extends AbstractReadOnlyModel<T> {

    private Object object;
    private String functionName;
    private R key;
    private Class<R> keyClass;

    public FunctionReflectionReadOnlyModel(Object object, String expression, Class<R> keyClass) {
        this.object = object;
        this.functionName = getFunctionName(expression);
        this.key = getKey(expression);
        this.keyClass = keyClass;
    }

    @Override
    public T getObject() {
        try {
            Method method = object.getClass().getMethod(functionName, keyClass);
            return (T)method.invoke(object, key);
        } catch (Exception ex) {
            //process exception
            return null;
        }
    }
}

我读到仅限使用的PropertyModel已经太晚了。在这种情况下,您可以从PropertyModel继承类并更改getModel/setModel,如示例函数ReflectionReadOnlyModel中所示。所以您不需要更改其他API类。但是,如果您想要PropertyModel(嵌套对象)的所有功能,您需要实现它。

正如@merz所回答的那样,Wicket的PropertyModel不支持这一点,实际上PropertyResolver不支持这一点

如果使用
java.util.Map
,则PropertyResolver支持此类访问:

public Map<String, String> getProperty() {return theMap;}
publicmap getProperty(){returnthemap;}

检查org.apache.wicket.core.util.lang.PropertyResolver的javadoc。

正如@merz所回答的那样,wicket的PropertyModel不支持这一点,实际上是PropertyResolver支持这一点

如果使用
java.util.Map
,则PropertyResolver支持此类访问:

public Map<String, String> getProperty() {return theMap;}
publicmap getProperty(){returnthemap;}

查看org.apache.wicket.core.util.lang.PropertyResolver的javadoc。

我正在使用TextFilteredPropertyColumn,因此我想找出一种在PropertyModel中处理此问题的方法,因为更改模型的类型需要大量重建多个类,但没有什么好处。我正在使用TextFilteredPropertyColumn,因此,我想找出一种在PropertyModel中处理此问题的方法,因为更改模型的类型将需要大量重建多个类,但几乎没有什么好处。谢谢@martin-g。这也是我得出的结论。我希望有什么我没看到的。我最初尝试了一个映射,它正在工作,我在AbstractTextComponent中收到“无法解析模型类型”警告,我似乎无法摆脱它。我正在使用IFilterStateLocator在SortableDataProvider中存储多个筛选器。我的想法是看看是否可以构建一个IFilterStateLocator,它的工作方式类似于地图,但可以按照我想要的类型进行转换。警告针对7.3.0和6.22.0(或6.23.0)进行了修复。真棒!我检查了7,但我使用的是旧版本!谢谢@martin-g。这也是我得出的结论。我希望有什么我没看到的。我最初尝试了一个映射,它正在工作,我在AbstractTextComponent中收到“无法解析模型类型”警告,我似乎无法摆脱它。我正在使用IFilterStateLocator在SortableDataProvider中存储多个筛选器。我的想法是看看是否可以构建一个IFilterStateLocator,它的工作方式类似于地图,但可以按照我想要的类型进行转换。警告针对7.3.0和6.22.0(或6.23.0)进行了修复。真棒!我检查了7,但我使用的是旧版本!看看你的代码,看起来这正是我需要做的;但是,我不能简单地改变模型,而不会对其他类产生重大影响;然而,我没有选择简单地改变模型而不会对其他类产生重大影响。