Вызов метода получения из родительского абстрактного класса - PullRequest
1 голос
/ 12 декабря 2011

Вот так выглядят мои занятия:

public abstract class BaseForm extends Z{
    protected String someString;

    public String getSomeString(){
        return this.someString;
    }

    public void setSomeString(String some){
        this.someString = some;
    }
}

public abstract class AdvancedForm extends BaseForm{
    protected Something selectedThing;
    protected List<Something> listOfThings;

    public Something getSelectedThing(){
        return this.selectedThing;
    }

    public void setSelectedThing(Something thing){
        this.selectedThing = thing;
    }    

    public List<Something> getListOfThings(){
        return this.listOfThings;
    }

    public void setListOfThings(List<Something> list){
        this.listOfThings = list;
    }
}

public class FinalForm extends AdvancedForm{
    //Lot of stuff done here
}

Итак, у меня есть нечто похожее на то, что вы видите выше Проблема возникает, когда я создаю JSP, и он пытается вызвать методы get/setListOfThings.

<html:html>
    ...
    <html:select name="FinalForm" property="selectedThing">
        <html:optionsCollection name="FinalForm" property="listOfThings" label="label" value="value" />
    </html:select>
    ...
</html:html>

Я знаю, что здесь чего-то не хватает (struts-config.xml и tiles-def.xml существуют и являются правильными), но моя точка зрения заключается в том, что распорки должны вызывать метод FinalForm setListOfThings. И это должен вызывать метод AdvancedForm setListOfThings (который реализован), потому что FinalForm расширяет AdvancedForm, и я не переопределяю метод в FinalForm.

Во всяком случае, это не работает, и я не знаю, что случилось. Единственный способ, которым он работает, - это переопределить метод и явно вызвать setListOfThings из AdvancedForm.

public class FinalForm extends AdvancedForm{
    //...
    public List<Something> getListOfThings(){
        return super.getListOfThings();
    }
}

Я хочу избежать этого переопределения, потому что цель создания AdvancedForm класса состоит в том, чтобы удалить большую часть функциональности, которую использует большинство моих форм (но не все, это причина существования * 1029). * и AdvanceForm классы).

Есть идеи, почему это не работает? Есть идеи, чтобы улучшить это? Кто-нибудь может объяснить мне, что я делаю не так? Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 12 апреля 2013

Ваша функция будет отлично работать.Но если вы рендерите результат в Struts JSON, он не получит свойства суперкласса.Если это json, вы должны определить ваш struts.xml следующим образом

<result type="json">
  <param name="ignoreHierarchy">false</param>
</result>

Подобное обсуждение: Как включить поля родительского класса в ответ json, используя плагин struts 2 json

0 голосов
/ 12 декабря 2011

Это не работает только потому, что метод защищен. Как только вы переопределяете его, он работает, потому что вы делаете метод переопределения общедоступным.

Просто сделайте базовые методы общедоступными, и (почти) все будет в порядке.

После отправки формы необходимо вызвать метод setSelectedThing. Проблема в том, что Struts не может волшебным образом преобразовать параметр String, который он получает в запросе, в экземпляр Something. Ваш метод получения и установки свойства selectedThing должен использовать String вместо Something.

0 голосов
/ 12 декабря 2011

Вам нужно сделать метод public вместо protected в суперклассе, иначе классы Struts не смогут его увидеть.

...