【问题标题】:Abstract classes and Spring MVC @ModelAttribute/@RequestParam抽象类和 Spring MVC @ModelAttribute/@RequestParam
【发布时间】:2011-11-12 07:25:00
【问题描述】:

我的 Spring/Hibernate 应用程序中有一个模型类层次结构。

在向 Spring MVC 控制器提交 POST 表单时,是否有任何标准方法来指定所提交对象的类型,以便 Spring 可以实例化接收方法的 @ModelAttribute 或 @RequestParam 中声明的类型的正确子类?

例如:

public abstract class Product {...}
public class Album extends Product {...}
public class Single extends Product {...}


//Meanwhile, in the controller...
@RequestMapping("/submit.html")
public ModelAndView addProduct(@ModelAttribute("product") @Valid Product product, BindingResult bindingResult, Model model)
{
...//Do stuff, and get either an Album or Single
}

Jackson 可以使用 @JsonTypeInfo 注释将 JSON 反序列化为特定的子类型。我希望 Spring 也能做到这一点。

【问题讨论】:

    标签: java inheritance binding spring-mvc jackson


    【解决方案1】:

    Jackson 可以使用 @JsonTypeInfo 注释。我希望 Spring 也能做到这一点。

    假设您使用 Jackson 进行类型转换(如果 Spring 在类路径中找到它并且您的 XML 中有 <mvc:annotation-driven/>,则 Spring 会自动使用 Jackson),那么它与 Spring 无关。注释类型,Jackson 将实例化正确的类。不过,您必须在 Spring MVC 控制器方法中进行instanceof 检查。

    cmets 后更新:

    看看15.3.2.12 Customizing WebDataBinder initialization。您可以使用@InitBinder 方法根据请求参数注册编辑器:

    @InitBinder
    public void initBinder(WebDataBinder binder, HttpServletRequest request) {
        String productType = request.getParam("type");
    
        PropertyEditor productEditor;
        if("album".equalsIgnoreCase(productType)) {
            productEditor = new AlbumEditor();
        } else if("album".equalsIgnoreCase(productType))
            productEditor = new SingleEditor();
        } else {
            throw SomeNastyException();
        }
        binder.registerCustomEditor(Product.class, productEditor);
    }
    

    【讨论】:

    • 谢谢,我的意思是当提交 JSON 有效负载,而不是普通的 POST 表单提交时,这是可能的。
    • 嗨,我尝试解决类似的问题,但没有结果..这是我的问题:stackoverflow.com/questions/21550238/…你能帮帮我吗??
    猜你喜欢
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 2015-06-04
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    相关资源
    最近更新 更多