2016-02-17 5 views
0

У меня есть объект модели, у которого есть геттер/сеттер, который принимает String.Можно ли передавать аргументы в выражении PropertyModel?

public String getStringValue(String key) 

мне нужно знать, если это возможно, чтобы использовать этот поглотитель с PropertyModel, и если да, то как я могу это сделать? Пример может выглядеть примерно так:

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

Я работаю с TextFilteredPropertyColumn, поэтому я хотел бы выяснить способ справиться с этим в PropertyModel, так как изменение типа модели было бы большим переустройством нескольких классов для небольшой выгоды. – JeredM

ответ

2

Невозможно сделать это. Но вы можете определить свою собственную калибровочную модель, чтобы сделать это через отражение. Например:

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 и изменять getModel/setModel, как в примере FunctionReflectionReadOnlyModel. Поэтому вам не нужно менять API других классов. Но если вы хотите, чтобы все функции PropertyModel (вложенные объекты) вам нужно реализовать.

+0

Глядя на ваш код, похоже, что это именно то, что мне нужно; однако у меня нет возможности просто менять модель без существенного влияния на другие классы. – JeredM

2

Как ответил @merz, это не поддерживается собственностью Wicket PropertyModel, фактически с помощью PropertyResolver.

PropertyResolver поддерживает такой доступ, если вы используете java.util.Map: Javadoc

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

Check org.apache.wicket.core.util.lang.PropertyResolver в.

+0

Спасибо @ martin-g. Это вывод, к которому я пришел. Я надеялся, что я чего-то не видел. Я сначала попробовал карту, и она работает, я принимаю предупреждение «Не могу разрешить тип модели» в AbstractTextComponent, и я не могу избавиться от него. Я использую IFilterStateLocator > для хранения нескольких фильтров в моем SortableDataProvider. Моя идея состояла в том, чтобы увидеть, могу ли я создать IFilterStateLocator, который работал как Map, но обработал кастинг по типу, который я хотел. – JeredM

+1

Предупреждение фиксировано для 7.3.0 и 6.22.0 (или 6.23.0). –

+0

Сладкий! Я проверил 7, но я был на более старой версии! – JeredM

Смежные вопросы