Spring控制器中的方法可以验证抽象参数类型吗?

时间:2017-11-27 18:16:53

标签: java spring controller attributes abstract

我正在开发一个允许用户创建5种不同类型订单的应用程序。我正在使用hibernate,所有5个子类都扩展了抽象的Order类。我希望能够做的是使用一个JSP来创建所有5种类型的订单,并将用户创建的任何子类类型传递给控制器​​,但使用父类类型。例如,PRNOrder是一个扩展抽象Order类的具体类。假设一个创建PRNOrder对象并将其传递给JSP的方法:

Order order = new PRNOrder();
order.setOrderType(orderTypeService.findByName("PRN"));

我目前能够使用我的控制器方法使用以下方法签名验证PRNOrder类型:

public String savePRNOrder(@PathVariable String idPatient, @Valid @ModelAttribute("order") PRNOrder order, 
        BindingResult result, ModelMap model) 

当我尝试将PRNOrder属性更改为只是为了尝试使其与每个子类类型兼容时,我得到以下异常:

org.springframework.beans.BeanInstantiationException: Failed to instantiate [mdhis_webclient.entity.Order]: Is it an abstract class?; nested exception is java.lang.InstantiationException

Spring显然试图将对象实例化为Order对象,但有没有办法让它将对象视为对象实际上的任何类型而不是让它尝试实例化一个抽象类?

谢谢!

1 个答案:

答案 0 :(得分:0)

嗯,我找到了有用的东西。我在控制器中创建了以下方法:

@ModelAttribute("order")
public Order getOrderType(final HttpServletRequest request)
{
    String url = request.getRequestURI();
    String orderType = url.substring(url.lastIndexOf("-") + 1, url.length());
    switch (orderType)
    {
        case "PRNOrder" : return new PRNOrder();
    }
    return null;
}

这允许我使用Order类作为类型,因为这个方法似乎告诉Spring实际实例化了什么类型的对象。我可以看到这方面的潜在问题,因为我有其他使用order属性的方法,但这似乎有用,我会用其他类型扩展它。