Spring MVC Binding - PullRequest
       13

Spring MVC Binding

1 голос
/ 29 июня 2011

Я не уверен, возможно ли это, но мне нужно сделать какое-то странное связывание с Spring MVC. Мы должны динамически генерировать страницу, которая является предшественником для запуска некоторых отчетов. Разные отчеты будут иметь разные критерии, которые ограничивают доступные данные в отчете.

Я надеялся, что смогу сделать что-то вроде этого:

public interface ReportingStrategy extends Serializable {
    public String getReportingCriteria(); //Each subclass will generate the SQL needed
}

public class DateLimitingStrategy implements ReportingStrategy {

    private Date startDate;
    public Date getStartDate() { return startDate; }
    public void setStartDate(Date startDate) { this.startDate = startDate; }

    private Date endDate;
    public Date getEndDate() { return endDate; }
    public void setEndDate(Date endDate) { this.endDate = endDate; }

    public String getReportingCriteria() {
        //Generate SQL for date range (where necessary)
    }
}

public class SortingStrategy impelements ReportingStrategy {
    public String sortValue;
    public String getSortValue() { return this.sortValue; }
    public void setSortValue(String sortValue) { this.sortValue = sortValue; }
}

Так что это кажется довольно простой идеей.

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

@RequestMapping(method = RequestMethod.GET) 
public ModelAndView(@RequestParam("reportName") String reportName) {
    ModelAndView mav = new ModelAndView("showReportingStrategies");
    mav.addObject("backingObject", new BackingObject(reportName));
    return mav;
}

@RequestMapping(method = RequestMethod.POST)
public ModelAndView(@ModelAttribute("backingObject") BackingObject bo, BindingResult result) {
    //More logic here   
}

public class BackingObject implements Serializable {
    private List<ReportingStrategy> reportingStrategies;
    public void setReportingStratgies(List<ReportingStrategy> reportingStrategies) {
        this.reportingStrategies = reportingStrategies;
    }
    public List<ReportingStrategy> getReportingStrategies() { return this.reportingStrategies; }
}

Возможно ли это даже путем расширения PropertyEditorSupport и выполнения магии InitBinder?

1 Ответ

1 голос
/ 30 июня 2011

Самая простая вещь - использовать @SessionAttributes, чтобы поместить ваш вспомогательный объект в сеанс. Таким образом, конкретные типы присутствуют во время привязки. Связыватель не должен быть в состоянии выяснить, какой реализатор ReportingStrategy использовать, он уже там. Конечно, состояние на стороне сервера может быть проблемой для вас, и если вы используете необработанный MVC без веб-потока и ваше приложение поддерживает использование нескольких вкладок, вам придется справиться с этим, как всегда.

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