Spring MVC - дочерний объект потерян после отправки - PullRequest
1 голос
/ 05 мая 2011

Я попытаюсь объяснить мою проблему как можно более полно и кратко ...

Веб-приложение, созданное на Spring MVC 2.5 + Hibernate + Java 6 (без использования аннотаций!).

У меня есть контроллер, расширяющий SimpleFormController, и страница jsp, которая является его formView и successView.

Этот контроллер должен помочь мне вставить в БД сущность PracticeT, которая подключилась (многие к одному)) объект поиска PracticeConfT (воспринимайте его как «типологию»).Мне нужно выбрать эту «типологию» через выпадающее меню.В моем веб-приложении мне нужно иметь возможность сохранять вставленные данные и, когда я хочу, отправить запрос на утверждение.

На странице есть несколько текстовых полей и это раскрывающееся меню.Компонентом по умолчанию, называемым «команда», является NewPracticeBean, имеющий ссылку на объект PracticeT.

ПРОБЛЕМА ЕСТЬ: Я заполняю форму, выбираю типологию из раскрывающегося меню, отправляю форму исохраняйте данные в БД, но когда я возвращаюсь к представлению, все свойства есть, но выпадающего меню нет: в нем есть все разрешенные опции, но никто не выбран.Некоторые проверки показали, что сущность PracticeConfT имеет значение null (но она была правильно записана в db, и отладка сохраняется в модели до самого конца метода onSubmit !!!).

Надеюсь, кто-то сможетПомоги мне.Заранее спасибо!До свидания, Dolfiz

Вот некоторый полезный код: (Я не думаю, что конфиг hibernate может быть проблемой, но если вам это нужно, я тоже могу опубликовать его)

newPractice.jsp

<form:form id="newPracticeForm" commandName="command">
    <input type="hidden" name="action"/>
    <spring:nestedPath path="practiceT">
        <table class="table-data-form">
            <tr>
                <td class="left"><spring:message code="" text="Practice type" /></td>
                <td>
                    <form:select path="practiceConfT" multiple="false">
                        <form:option value="" label="- seleziona -"/>
                        <form:options items="${practiceTypeList}" itemValue="idPracticeConf" itemLabel="practiceName"/> 
                    </form:select>
                </td>
            </tr>
            <tr>
                <td class="left">
                    <spring:message code="" text="Opzione divisa" />
                    <br/><form:errors cssClass="errors" path="opzioneDivisa" />
                </td>
                <td><form:input path="opzioneDivisa" /></td>
            </tr>
            <tr>
                <td colspan="1">
                    <input type="submit" name="submit" id="submit" value="Save" class="buttonEMS" style="width:100px;" />
                </td>
            </tr>
        </table>
    </spring:nestedPath>
</form:form>

NewPracticeBean.java

public class NewPracticeBean implements Serializable{

    private PracticeT practiceT;
    private String action;
    private boolean typeSelected;

    public NewPracticeBean(){
        super();
        this.practiceT = new PracticeT();
    }

    // getters & setters...
}

PracticeT.java

public class PracticeT implements java.io.Serializable {

    private long idPractice;
    private PracticeConfT practiceConfT;
    private String opzioneDivisa;

    // getters & setters...
}

PracticeConfT.java

public class PracticeConfT implements java.io.Serializable {

    public static final String PRACTICE_NAME = "practiceName";

    private long idPracticeConf;
    private String practiceName;

    // getters & setters...
}

NewPracticeController.java открытый класс NewPracticeController расширяет SimpleFormController {

    protected SmartLogger log = SmartLogger.getLogger(this.getClass());

    private PracticeSu practiceSu;
    private ConfigurationSu configurationSu;

    private HibernateEntityDataBinder practiceConfTBinder;
    private HibernateEntityDataBinder practiceTBinder;

    public NewPracticeController() {
        setCommandClass(NewPracticeBean.class);
        setCommandName("command");
    }

    @Override
    protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
        log.trace("NewPracticeController -- initBinder");
        super.initBinder(request, binder);
        binder.registerCustomEditor(PracticeT.class, "practiceT", practiceTBinder);
        binder.registerCustomEditor(PracticeConfT.class, "practiceT.practiceConfT", practiceConfTBinder);
    }

    @Override
    protected Map referenceData(HttpServletRequest request) throws Exception {
        log.trace("NewPracticeController -- referenceData");
        Map model = new HashMap();
        RetrieveAllEntitiesReq req = new RetrieveAllEntitiesReq();
        req.setEntity(PracticeConfT.class);
        req.setOrderProperty(PracticeConfT.PRACTICE_NAME);
        RetrieveAllEntitiesResp resp = configurationSu.retrieveAllEntities(req);
        List entitiesList = resp.getEntitiesList();
        model.put("practiceTypeList", entitiesList);

        return model;
    }

    @Override
    protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception {
        NewPracticeBean practiceBean = (NewPracticeBean)command;
        Map model = errors.getModel();

        CreateNewPracticeReq req = new CreateNewPracticeReq();
        req.setPracticeT(practiceBean.getPracticeT());
        CreateNewPracticeResp resp = practiceSu.createNewPractice(req);
        practiceBean.setPracticeT(resp.getPracticeT());

        model.putAll(referenceData(null));
        model.put(getCommandName(), practiceBean);

        return new ModelAndView(getSuccessView(), model);
    }

    // setters and getters...
}

1 Ответ

0 голосов
/ 05 мая 2011

Потратив некоторое время с OptionsTag, OptionWriter и SelectValueComparator, я бы сказал, тогда вывод «selected» основан на Object.equals.

Таким образом, если по какой-либо причине (Lazyloading ...) Объект PracticeT.practiceConfT и соответствующие Объекты model.put("practiceTypeList", entitiesList) не ОДИНАКОВЫ ((==), то forms:options не будет выбирать их, пока метод equals Неправильно реализовано.

Так что, я думаю, вам нужно реализовать правильный метод equals, даже если это не решило эту проблему, всегда лучше иметь правильный метод equals, чем неправильный или ни одного.


Правильно реализованный означает, что он должен обратить внимание на тот факт, что используется с Hibernate. (например, используйте if (Hibernate.getClass(this) != Hibernate.getClass(other)) вместо `if (this.getClass ()! = other.getClass ())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...