我有一个模型对象,其getter / setter接受String
。
public String getStringValue(String key)
我需要知道是否可以使用带有PropertyModel
的getter,如果可以,我该怎么做?示例可能如下所示:
new PropertyModel<String>(myObj, "StringValue[key]");
答案 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
:
public Map<String, String> getProperty() {return theMap;}
检查org.apache.wicket.core.util.lang.PropertyResolver&#39; javadoc。