2011-12-15 106 views
1

是否可以通过某种方式注释Java方法,以便稍后可以为另一个方法提供字段标识符或类似的内容,以便此方法可以调用正确的方法?注释方法以便稍后选择

我知道通常你会用接口做到这一点,但在我的情况下,这将是一个巨大的接口数量......我需要在我的数据库的实体类中使用它(我不允许使用一个ORM映射)

例如:我有实体

public class Account{ 
    private String username; 
    private String password; 
    private String name; 
    private String mail; 


    public void setUserName(String username){ 
     this.username = username; 
    } 

    public String getUserName(){ 
     return username; 
    } 

    [all other getter/Setter...] 
} 

现在我想告诉它需要验证的字段,例如username场的方法。

认为应该是这样的没有方法:

public void validateField(XXX Field, Entity entity) throws ValidationFailedException, EmptyFieldException; 

其中XXX是某种FieldIdentifier。

这是在Java中的任何可能的方式吗?

我只能猜测它,我使用public static final ìnt的东西在里面给每一个领域的方法或使...

回答

3

你用什么?我没有看到我可以猜出你的框架的任何注释。如果你使用Hibernate,你可以使用像@NotNull或别的东西,甚至做你的自定义验证: 这是你如何将你的榜样去:

public class Account{ 

    @NotNull(message="This field should not be null") 
    private String username; 
    @NotBlank(message="This string should not be empty or null") 
    private String password; 
    private String name; 
    private String mail; 


    public void setUserName(String username){ 
     this.username = username; 
    } 

    public String getUserName(){ 
     return username; 
    } 

    [all other getter/Setter...] 
} 

http://silentwalker.wordpress.com/2009/04/07/custom-validation-in-hibernate/

您也可以创建你自己的注释,而不使用任何框架,并使用@prepersist或其他。基本上天空是极限。

P.小号因为你不希望使用任何非内部的代码,这里是你如何接近:

首先,你可以定义一个注释

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.FIELD) 
public @interface NotNull{ 
    public String message() default ""; 
} 

然后,坚持课前,你会检查其田:

所以,你有这样的事情:

Field[] classFields = yourObjectPrePersist.getClass().getDeclaredFields(); 
for (int i = 0; i < classFields.length; i++) { 
     classFields[i].setAccessible(true);//take notice that if you use a SecurityManager, you should work around it 
     if (classFields[i].getAnnotation(NotNull.class) != null) { 
      Object value = classFields[i].get(yourObjectPrePersist); 
      //here check if value is null or not and then return the message 
      if (value == null) { 
       throw new SomeException(((NotNull) classFields[i].getAnnotation(NotNull.class)).message()); 
      } 
     } 
    } 
+0

是的,我们需要excectly,但是我们不允许使用任何ORM ..我们必须从头开始编写:/ – reox 2011-12-15 19:59:14

0

注解似乎并不像正确的解决方案,您所描述的问题。

一种可能性是传入需要验证的字段的名称,然后使用java.beans.BeanInfo类访问实体的字段值。这将允许您访问对象的任意属性,而无需处理所有反射的复杂性。

0

您可以使用反射;见the documentation for java.lang.reflect.Field。调用者可以将字段名称作为字符串传递,validateField可以使用类似Field f = entity.getClass().getField(fieldName)的内容。

但这通常不是一个好主意。 。 。反射很棒,但它需要大量的样板代码,并且您在可维护性方面付出了高昂的代价。 (你也付出了性能损失,尽管以我的经验来看,可维护性惩罚比性能损失要差得多)。我个人在测试代码中使用了很多反射(它可以帮助编写非常全面的测试),并且我使用框架像Spring和Hibernate依赖于反射,但是我在我自己的生产代码中避免它。

0

你可以使用一个通用接口

 
public interface Field { 
    public String getValue(); 
} 

,并打电话给你的validate方法与anonymouse类

 
validator.validate(new Field() { 
    return account.getUsername() 
}); 

(或旧的Java)有关直接使用java.lang.Methode

 
validator.validate(new Field() { 
    public String getValue() { 
     return account.getUsername(); 
    } 
}); 

否则什么?

PS:很抱歉的报价,计算器没有让我直接发布我的文字,说这是格式不正确: -/