是否可以在 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。
我有一个模型对象,它有一个接受 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
:
public Map<String, String> getProperty() {return theMap;}
检查 org.apache.wicket.core.util.lang.PropertyResolver 的 javadoc。