Struts 2 не заполняет POJO от клиента - PullRequest
2 голосов
/ 27 августа 2011

У меня есть Java-объект со многими другими вложенными объектами и списками объектов. Когда запрос приходит от клиента, я вижу, что объект заполняется только на несколько уровней. Есть ли какая-либо конфигурация, которая устанавливает это Struts 2? Вот мой пример.

class MyActionClass extends ActionSupport {
    private Abc abc;
    public Abc getAbc() {
        return abc;
    }
    public void setAbc(Abc abc) {
        this.abc = abc;
    }
    public String populate() {
        MyService myService = new MyService();
        abc = myService.getMyAbc();
        return SUCCESS;
    }
    public String update() {
        MyService myService = new MyService();
        myService.updateAbc(abc);
        return SUCCESS;
    }
}

class Abc {
    private List<Def> defList;
    private Ghi ghi;
    public void setDefList(List<Def> defList) {
        this.defList = defList;
    }
    public List<Def> getDefList(){
        return defList;
    }
    public void setGhi(Ghi ghi) {
        this.ghi = ghi;
    }
    public Ghi getGhi() {
        return ghi;
    }
}

class Def {
    private String name;
    private long id;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
}

class Ghi {
    private List<Def> defList;
    private String ghiName;

    public void setDefList(List<Def> defList) {
        this.defList = defList;
    }
    public List<Def> getDefList() {
        return defList;
    }
    public void setGhiName(String ghiName) {
        this.ghiName = ghiName;
    }
    public String getGhiName() {
        return ghiName;
    }
}

Когда я вызываю метод populate и когда отправляю в jsp, итерация происходит хорошо со всеми элементами. Но когда я пытаюсь обновить, то есть когда отправляется форма, вызывается метод update(), но переменная экземпляра abc не заполняется полностью.

Я видел переданный URL, и все, кажется, в порядке. Позвольте мне рассказать вам, что происходит. URL будет что-то вроде (разделение с переносом строки для легкого понимания здесь),

&abc.defList[0].name=alex
&abc.defList[0].id=1
&abc.defList[1].name=bobby
&abc.defList[1].id=2
&abc.ghi.ghiName=GHINAME
&abc.ghi.defList[0].name=Jack
&abc.ghi.defList[0].id=1
&abc.ghi.defList[1].name=Jill
&abc.ghi.defList[1].id=2

В этом случае defList внутри abc и ghi.ghiName в abc заполняются без проблем. Но defList из abc.ghi не заполнен. Это обычное поведение Struts 2? Есть ли какие-либо средства, с помощью которых это может быть отменено?

1 Ответ

1 голос
/ 30 августа 2011

Есть проблема решена.Struts 2 рок.Поскольку код, который я получил, был для исправления ошибки, я не знал, что внутри него, даже не проверял его один раз.

Виновным был метод toString(), который был переопределен.На карте не было проверки на нулевое значение и был вызван метод entrySet().Это сгенерировало исключение и не позволило Struts заполнить объекты.

Для лучшего понимания Struts действительно вызывает метод toString() для некоторых целей при заполнении.Если кто-то сталкивается с этим в будущем, не забудьте проверить, переопределили ли вы toString() и все ли в нем установлено.

...