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

时间:2016-02-17 22:48:16

标签: wicket wicket-6

我有一个模型对象,其getter / setter接受String

public String getStringValue(String key)

我需要知道是否可以使用带有PropertyModel的getter,如果可以,我该怎么做?示例可能如下所示:

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

2 个答案:

答案 0 :(得分:2)

没有建立这样做的方法。但是您可以通过反射定义自己的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;
        }
    }
}

您只需要根据需要实现getFunctionName(String表达式)和getKey(String表达式)。

但我认为最好使用另一种变体。它并不特别符合你的要求,但它是典型的。还需要Java 8。

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

    private Function<R, T> function;
    private R key;

    public FunctionWithKeyReadOnlyModel(Function<R, T> function, R key) {
        this.function = function;
        this.key = key;
    }

    @Override
    public T getObject() {
        return function.apply(key);
    }
}

然后你可以像这样使用它:

new FunctionWithKeyReadOnlyModel(obj::getStringValue, "key");

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

答案 1 :(得分:2)

正如@merz所回答,Wicket的PropertyModel不支持,实际上是PropertyResolver。

如果您使用java.util.Map

,PropertyResolver支持此类访问权限
public Map<String, String> getProperty() {return theMap;}

检查org.apache.wicket.core.util.lang.PropertyResolver&#39; javadoc。