【问题标题】:How to reuse fieldlength in form, validation and ddl?如何在表单、验证和 ddl 中重用字段长度?
【发布时间】:2010-12-21 11:13:06
【问题描述】:

我正在开发一个包含大量输入表单的 Spring 应用程序。我想在 UI 表单、验证和 JPA 注释中重用字段长度。有没有一种优雅的方法来解决这个问题。我目前的解决方案是,使用常量来声明长度:

public class Person
{
   public static final int FIRSTNAME_LENGTH = 25;

   @Column(length=FIRSTNAME_LENGTH)
   private String firstName;

   ...
}

然后在Validator和Jsp中复用常量

...

<form:input path="firstName" 
    maxlength="<%= Integer.toString(Person.FIRSTNAME_LENGTH) %>"/>

...

这很冗长。

这个问题有没有更优雅的解决方案?

【问题讨论】:

  • Dominik,您的“优雅”解决方案在我看来非常聪明。我可能不得不使用它。无论如何,这是个好问题,这是每个人都必须做的事情,但似乎没有内置的解决方案。
  • 我很高兴你在这里放了一个赏金,我也想看到这个答案。我希望他们有社区赏金的功能,我会提供一些我的代表。

标签: java jpa spring-mvc annotations


【解决方案1】:

很可能访问存储在注释中的信息。事实上,这是它们的主要目的:在类/方法/字段上存储元信息。 以下是如何访问存储在 @Column 注释中的长度的示例:

import javax.persistence.Column;
import javax.persistence.Entity;

@Entity
public class Person {

   @Column(length=30)
   private String firstName;

   public static void main(String[] args) throws SecurityException, NoSuchFieldException {
      Object person = new Person();
      //find out length    
      System.out.println(person.getClass().getDeclaredField("firstName").getAnnotation(Column.class).length());
   }
}

您应该能够创建一些自定义标签或 bean 来通用地提取此信息。

创建自己的注释并不难。您可以考虑创建一个指定要包含在表单中的字段、应如何呈现、描述等的字段。而不是创建通用表单。再说一次,您可能不喜欢混合域和演示文稿。

【讨论】:

  • 这一行写得很完整,著名的 Java 简洁性是鲜活的。很好的提示,谢谢。
  • 只是一个后续,java.lang.Class.getDeclaredField() 抛出两个检查异常,NoSuchFieldException 和 SecurityException。这使此方法更加笨拙,如果您尝试实施此解决方案,请牢记这一点。
【解决方案2】:

我在使用Hibernate的时候也问过类似的问题,

Getting column length from Hibernate mappings?

不知道如何在 JPA 下提取此信息,但如果您使用 Hibernate 作为底层,您可以尝试直接访问 Hibernate 并实现上述解决方案。

但是,Hibernate 解决方案与您在回答中概述的解决方案一样不优雅,另外一个缺点是将您的 JPA 实现与 Hibernate 联系在一起。

【讨论】:

    【解决方案3】:

    EJB 提供的解决方案是读取列长的注释值。 James McMahon 指出这暴露了 Hibernate 的实现。这可以通过 getter 方法相当简单地解决。假设有一个声明方法 getFirstNameLength 的 Person 接口:

    import javax.persistence.Column;
    import javax.persistence.Entity;
    
    @Entity
    public class PersonImplementation extends Person {
    
       @Column(length=30)
       private String firstName;
    
       public int getFirstNameLength() {
           return this.getClass().getDeclaredField("firstName").getAnnotation(Column.class).length();
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 2013-05-15
      相关资源
      最近更新 更多