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

Is it possible to pass arguments in the expression of a PropertyModel?

我有一个模型对象,它有一个接受 String 的 getter/setter。

public String getStringValue(String key)

我想知道是否可以将 getter 与 PropertyModel 一起使用,如果可以,我该怎么做?示例可能如下所示:

new PropertyModel<String>(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;
        }
    }
}

您只需要根据需要实现 getFunctionName(String expression) 和 getKey(String expression)。

但我认为最好使用其他变体。这不是你问的特别是什么,但它是典型的。还需要 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 继承 class 并像 FunctionReflectionReadOnlyModel 示例中那样更改 getModel/setModel。所以你不需要改变其他 classes API。但是,如果您想要 PropertyModel(嵌套对象)的所有功能,则需要实现它。

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

如果您使用 java.util.Map:

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

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