Форма пружины не загружается Выберите с правильными данными - PullRequest
0 голосов
/ 02 декабря 2011

Использование Spring 3.1. У меня есть форма, которая заполняет POJO хранится в БД. Однако в этом POJO также есть экземпляр другого POJO:

class Job {
    private id;
    private Filter filter;
    //getters and setters
}

и класс Filter:

class Filter {
    private id;
    private name;
    //getters and setters
}

Итак, в форме, которая заполняет объект Job, я пытаюсь отобразить объекты Filter в выбранном объекте. Вся эта часть, кажется, работает правильно. Проблема возникает, когда я пытаюсь отредактировать объект Job, у которого уже есть фильтр. Объект выбора не устанавливает себя автоматически для соответствующего объекта фильтра, связанного с заданием. Хотите знать, если кто-то может дать мне знать, что я облажался. Вот JSP:

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

<div align="center">
<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>
            <button dojoType="dijit.form.Button" id="testButton">Test</button>
        </td></tr>
    </table>
</sf:form>
</div>

А вот контроллер (или хотя бы соответствующие части):

@Controller
public class JobController {
@Autowired
private JobService jobService;
@Autowired
private ProvisionService provisionService;

@InitBinder
protected void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(Date.class, new DatePropertyEditor());
    binder.registerCustomEditor(Provision.class, new ProvisionEditor(provisionService));
}

@ModelAttribute("filters")
@RequestMapping(value="/job", method=RequestMethod.GET)
public List<Provision> showJobForm(Model model) {
    model.addAttribute(new Job());

    return provisionService.getAll();
}

@RequestMapping(value="/job", method=RequestMethod.POST)
public String submitJobForm(@Valid Job job, BindingResult bindingResult) {
    if(bindingResult.hasErrors())
        return "job";

    job.setStatus("Running");
    JobManager.AddJob(job);

    jobService.save(job);

    return "redirect:/";
}

@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", provisionService.getAll());
    return "job";
}
}

И ProvisionEditor, необходимый для преобразования Provision из идентификатора выбора в Provision:

public class ProvisionEditor extends PropertyEditorSupport {

private ProvisionService provisionService;

public ProvisionEditor(ProvisionService provisionService) {
    this.provisionService = provisionService;
}

public void setAsText(String value) {
    long provisionId = Long.parseLong(value);
    Provision p = provisionService.getById(provisionId);
    setValue(p);
}
}

Итак, как я уже сказал, все работает хорошо при создании новой работы. Список Положений загружается в выбор, все правильно назначается и правильно сохраняется в БД. Однако, когда пользователь выбирает условие позднее и редактирует его, он приводит их к той же форме, и все данные загружаются правильно, кроме выбора выбора. Он загружает список положений в, но не выбирает правильный. Есть идеи, как я могу это исправить? Спасибо.

Ответы [ 2 ]

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

Оказывается, проблема в том, что я не переопределил Equals и Hashcode для объектов.После решения другой проблемы я наткнулся на проблему, исправил ее, и все стало работать как надо.Это сделано особенно легко, потому что я использую Eclipse, и он имеет автоматическую генерацию переопределения обоих этих методов.

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

попробуйте этот код для страницы JSP

<form:select path="">
  <c:forEach items="" var="">
     <option value=""><c:out value="" /></option>
  </c:forEach>  
</form:select>

Это должно сработать для вас.

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