gpt4 book ai didi

java - 使用 Spring MVC 绑定(bind)表单对象 CGLIB 的动态表单

转载 作者:行者123 更新时间:2023-12-05 07:46:37 25 4
gpt4 key购买 nike

我有一个动态模型,由 X 数字组成,每个 radio 、文本、选择、选择多。这基本上就像后端的 EAV 数据库。

我需要用总共 N 个字段来呈现这个动态表单,然后验证提交的动态模型对象,然后使用字段定义的正则表达式对其进行验证。我希望通过 JSR 303 注释执行此验证。

因此,我想使用典型的 Spring MVC 开发方式绑定(bind)表单对象,通过 ModelAttribute @Valid 特性等。唯一的区别是模型对象在运行时之前是未知的/未定义的。

我倾向于使用 CGLIB 或类似的东西在运行时生成类,并用特殊的标签库呈现它,然后使用反射以某种方式使用特殊验证来验证它。

这样的事情完全超出了可能性范围吗?同样,我想做常规的 Spring MVC Controller 和模型,但使用动态表单对象。

最佳答案

这是可能的,但不能使用 cglib。 Cglib 是一个代理库,只允许您覆盖现有方法,但不允许定义新的方法,以便将动态模型传递给 Spring 或任何其他 bean 验证库。

当然可以使用 Javassist 或 Byte Buddy 生成此类。 (披露:我是作者)允许您定义此类元数据。例如,使用 Byte Buddy,您可以定义一个动态类:

new ByteBuddy()
.subclass(Object.class)
.defineField("foo", String.class, Visibility.PUBLIC)
.annotateField(AnnotationDescription.Builder.ofType(NotNull.class).build())
.make();

使用这段代码,您可以加载类,为 “foo” 字段分配一个值,并将此 bean 对象呈现给 bean 验证库。

与此同时,我觉得这种方法设计过度了。如果您需要为无法重新实现的特定 JSR 303 validator 提供兼容性,我只会采用此解决方案。否则,您可能更愿意直接验证数据。

如果您的框架还需要 getter 和 setter,您可以通过以下方式添加它们:

builder = builder
.defineMethod("getFoo", String.class, Visibility.PUBLIC)
.intercept(FieldAccessor.ofField("foo"));
.defineMethod("setFoo", void.class, Visibility.PUBLIC)
.withParameters(String.class)
.intercept(FieldAccessor.ofField("foo"));

关于java - 使用 Spring MVC 绑定(bind)表单对象 CGLIB 的动态表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40557116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com