Не уверен в правильности загрузки SELECT-объекта с помощью Spring - PullRequest
0 голосов
/ 08 декабря 2011

Не очень удачно получить помощь от любого из вас, весенних гуру, здесь.Надеюсь, на этот раз я лучше сформулирую вопрос, чтобы он стал более понятным.У меня довольно простое приложение Spring, использующее базу данных Mysql.По сути, я просто хочу знать, как правильно загружать данные в объект SELECT на форме, но мне нужен весь процесс.

Здесь немного больше глубины.У меня есть объект Job, который хранится в таблице Job в БД.Он привязан к форме, которую пользователь может заполнить, чтобы заполнить объект Job.Объект Job также имеет отношение «многие к одному» с объектом Filter, который хранится в отдельной таблице в БД.Таким образом, когда пользователь создает объект Job с помощью формы, появляется поле SELECT, в которое загружаются объекты Filter для выбора.Пока что весь мой код для этого работает нормально.Объекты фильтра отображаются и затем должным образом сохраняются в БД, так что я считаю, что эта часть правильно внизу.Проблема возникает, когда пользователь пытается редактировать объект Job.Я загружаю форму, и все данные из объекта Job правильно предварительно заполняются в различные поля, за исключением того, что в поле SELECT автоматически не устанавливается выбор сохраненных объектов Job.Объект SELECT загружается с объектами Filter, но он всегда имеет первый выбор, а не 4-й или что-то еще, что хранится в объекте Job.Ясно, что я не делаю что-то правильно или пропускаю какой-то важный аспект этого процесса.Если кто-нибудь может помочь мне здесь, я был бы очень признателен.Это ошибка в приложении для работы, которую я пытаюсь исправить, и я не могу найти решение.Во всяком случае, ниже я опубликовал то, что я считаю всем соответствующим кодом.

Объект задания

@Entity
public class Job implements Runnable {
    @Id @GeneratedValue
    private Long id;

    @ManyToOne
    @JoinColumn(name="filterId")
    private Filter filter;

    //getters and setters
}

Редактор фильтров (для перевода идентификаторапередается из формы в объект Filter)

public class FilterEditor extends PropertyEditorSupport {

private FilterService filterService;

public FilterEditor(FilterService filterService) {
    this.filterService = filterService;
}

public void setAsText(String value) {
    long filterId = Long.parseLong(value);
    Filter f = filterService.getById(provisionId);
    setValue(f);
}
}

Job Controller (соответствующие части)

@InitBinder
protected void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(Date.class, new DatePropertyEditor());
    binder.registerCustomEditor(Filter.class, new FilterEditor(filterService));
}

@RequestMapping(value="/job", method=RequestMethod.GET)
public void showJobForm(Model model) {
    model.addAttribute(new Job());

    model.addAttribute("filters", filterService.getAll());
}

@RequestMapping(value="/job/edit", method=RequestMethod.POST)
public String editJob(@RequestParam("jobHiddenList") String list, Model model) {
    log.info("Edit List: " + list);

    Job job = jobService.getById(Long.valueOf(list.trim()));

    model.addAttribute("job", job);
    model.addAttribute("filters", filterService.getAll());
    return "job";
}

и соответствующие частиJSP

<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>

<s:url value="/job" var="jobPost_url"/>
<s:url value="/job/provData" var="provData_url"/>

<sf:form method="POST" modelAttribute="job" dojoType="dijit.form.Form" action="${jobPost_url}">
    <script type="dojo/method" event="onSubmit">
        if (!this.validate()) {
            return false;
        }
        return true;
    </script>
    <sf:hidden path="id" />
    <table>
        <tr><td align="right">Customer:</td><td>
            <sf:input path="customer" dojoType="dijit.form.ValidationTextBox" trim="true" required="true"/><br/>
            <sf:errors path="customer" cssClass="error"/>   
        </td></tr>
        <tr><td align="right">Project:</td><td>
            <sf:input path="project" dojoType="dijit.form.ValidationTextBox" trim="true" required="true"/><br/>
            <sf:errors path="project" cssClass="error"/>    
        </td></tr>
        <tr><td align="right">Date:</td><td>
            <sf:input path="date" dojoType="dijit.form.DateTextBox" required="true"
                    constraints="{datePattern:'MMM d, y'}" /><br/>
            <sf:errors path="date" cssClass="error"/>   
        </td></tr>
        <tr><td align="right">Filter:</td><td><sf:select id="filter" path="filter" items="${filters}" itemValue="id" 
            itemLabel="programName"/></td>
        </tr>
        <tr><td colspan="2" align="right">
            <button dojoType="dijit.form.Button" type="submit">Submit</button>
        </td></tr>
    </table>
</sf:form>

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

Ответы [ 3 ]

1 голос
/ 08 декабря 2011

Снято в темноте, потому что я не эксперт Spring MVC и не знаю, используете ли вы Open Session In View или нет.

Если вы не используете Open Session In View и если Spring использует equals для сравнения выбранного фильтра с каждым фильтром в поле выбора, то проблема может быть связана с отсутствием надлежащего переопределения равных(и hashCode) в сущности фильтра.Действительно, у вас будет два разных экземпляра Filter, имеющих одинаковый идентификатор, но отличающихся в отношении equals.

1 голос
/ 08 декабря 2011

, пожалуйста, проверьте значение поля id, это то, что вы устанавливаете в качестве значения select ... Поле id должно преобразовываться в значение, которое находится в списке, в противном случае вы начнетеполучить результаты, подобные тому, который вы объяснили ..

0 голосов
/ 17 января 2013

Требуется для реализации методов hashCode () и equals (), чтобы просмотреть нужный элемент в раскрывающемся списке ... Я пробовал это !!!

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