Java Spring MVC绑定

Java Spring MVC绑定,java,spring,data-binding,spring-mvc,Java,Spring,Data Binding,Spring Mvc,我不确定这是否可行,但我需要使用SpringMVC进行一些奇怪的绑定。我们必须动态生成一个页面,这是运行某些报告的前提。不同的报告将具有不同的可用标准,这些标准限制报告上显示的数据 我希望我能做这样的事情: public interface ReportingStrategy extends Serializable { public String getReportingCriteria(); //Each subclass will generate the SQL needed }

我不确定这是否可行,但我需要使用SpringMVC进行一些奇怪的绑定。我们必须动态生成一个页面,这是运行某些报告的前提。不同的报告将具有不同的可用标准,这些标准限制报告上显示的数据

我希望我能做这样的事情:

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; }
}
@RequestMapping(method=RequestMethod.GET)
公共ModelAndView(@RequestParam(“reportName”)字符串reportName){
ModelAndView mav=新的ModelAndView(“显示报告策略”);
mav.addObject(“backingObject”,新的backingObject(reportName));
返回mav;
}
@RequestMapping(method=RequestMethod.POST)
公共ModelAndView(@ModelAttribute(“backingObject”)backingObject bo,BindingResult){
//这里有更多的逻辑
}
公共类BackingObject实现可序列化{
私有列表报告策略;
公共无效设置报告策略(列表报告策略){
this.reportingStrategies=reportingStrategies;
}
public List getReportingStrategies(){返回this.reportingStrategies;}
}

通过扩展PropertyEditorSupport并使用InitBinder magic,这是可能的吗?

最简单的方法是使用
@SessionAttributes
将支持对象放在会话上。这样,混凝土类型在绑定时出现。活页夹不需要能够找出要使用的
ReportingStrategy
的实现者,他们已经在那里了。当然,服务器端状态对您来说可能是一个问题,如果您使用的是没有webflow的原始MVC,并且您的应用程序支持多选项卡使用,那么您需要一如既往地处理这个问题。

最简单的方法是使用
@SessionAttributes
将您的支持对象放在会话上。这样,混凝土类型在绑定时出现。活页夹不需要能够找出要使用的
ReportingStrategy
的实现者,他们已经在那里了。当然,服务器端状态对您来说可能是一个问题,如果您使用的是没有webflow的原始MVC,并且您的应用程序支持多选项卡使用,那么您需要一如既往地处理这个问题。

在加载页面时,报告策略的类型是已知的,还是用户选择的?它们将是已知的,在该报告中,A可能有一个日期限制策略,而B可能同时有这两个策略。BackingObject的构造函数将在DB中查找它们(未显示)是加载页面时已知的报告策略类型,还是用户选择的报告策略类型?它们是已知的,只是在该报告中动态的A可能有一个日期限制策略,而B可能有两种策略。BackingObject的构造函数将在DB中查找它们(未显示)