当前位置: 首页 > 知识库问答 >
问题:

是否有一个相当于的“choice”Java注释?

西门经国
2023-03-14

我希望通过只允许请求中两个不同字段中的一个来字段验证Web服务请求。我从过去使用xsd的经验中知道,您可以有这样的东西来只允许FieldOne或FieldTwo:

<xs:complexType name="SomeType">
    <xs:choice>
        <xs:element name="FieldOne" type="target:FieldOneType"/>
        <xs:element name="FieldTwo" type="target:FieldTwoType"/>
    </xs:choice>
</xs:complexType>

我希望使用Java注释也能做到这一点。我目前正在使用注释来限制字段长度(@Digits)和空检查(@NotNull)。

有什么我可以用来“选择”的吗?

谢谢你的帮助。

更新:基本上,我正在寻找一种方法,只允许在web服务请求中输入两个不同字段中的一个,而不必手动在代码中进行验证。我目前正在使用bean验证注释来限制字段长度,并确定字段是强制性的还是可选的,例如:

@NotNull(message="Field cannot be empty")
@Size(max = 6, message = "Field length is too long")
private String fieldOne;

我想说用户只能输入字段一或字段二,但不能同时输入两者。这是否可以通过注释实现,或者我是否坚持在代码中编写此验证?

共有1个答案

司空鸣
2023-03-14

编辑:

要验证其中一个字段是否有值,我认为可以在类级别使用自定义验证器。以下是想法:

1.为注释创建界面:

@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ChoiceValidator.class)
@Documented
public @interface Choice {

    String[] fields();

    String message() default "{Choice.message}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};

}

2.创建一个ConstraintValidator的实现,以检查要验证的值是否在字段中选项注释中:

public class ChoiceValidator
        implements ConstraintValidator<Choice, Object> {

    private List<String> fields;

    @Override
    public void initialize(final Choice choice) {
        fields = Arrays.asList(choice.fields());
    }

    @Override
    public boolean isValid(final Object value, final ConstraintValidatorContext ctx) {

        int nonNullFieldCount = 0;
        for (String field : fields) {
            try {
                final String fieldValue = BeanUtils.getProperty(value, field);
                if (fieldValue != null) {
                    nonNullFieldCount++;
                }
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            } catch (InvocationTargetException e) {
                throw new RuntimeException(e);
            } catch (NoSuchMethodException e) {
                throw new RuntimeException(e);
            }
        }

        return nonNullFieldCount == 1;
    }

}

在那之后,你可以像这样使用它:

@Choice(fields= {"fieldOne", "fieldTwo"})
public  class Foo {

    String fieldOne;

    String fieldTwo;

}

原件:

我不确定我是否真的明白你的意思,但看起来你想要对对象字段的类型进行验证。如果出现这种情况,您可以尝试创建自定义注释,并通过ConstraintValidator执行此操作。以下是想法:

1.为注释创建界面:

public @interface Choice {

    Class<?>[] types();

}

2.创建一个ConstraintValidator的实现,以检查要验证的值是否在typesinsideChoice注释中:

public class ChoiceValidator implements ConstraintValidator<Choice, Object> {

    private List<Class<?>> clazzes;

    @Override
    public void initialize(Choice choice) {
        clazzes = Arrays.asList(choice.types());
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        for (Class<?> clazz : clazzes) {
            if (value.getClass().equals(clazz)) {
                return true;
            }
        }
        return false;
    }
}

在那之后,你可以像这样使用它:

@Choice(types = {FieldOneType.class, FieldTwoType.class})
public class Foo {

    Object someType;

}

希望这能有所帮助。

 类似资料:
  • 我想从移动网络链接在导航模式下打开谷歌地图。这对于使用https://developers.google.com/maps/documentation/ios/urlscheme的iOS设备来说似乎很容易 有Android系统的等价物吗?我只能找到这个:https://developer.android.com/guide/appendix/g-app-intents.html 但这不允许您指定“

  • 问题内容: 什么是Java相当于ManualResetEvent? 问题答案: 我所知道的最接近的是信号量。只需将其“许可”计数为1即可使用,获得/释放将与您从中获得的信息几乎相同。 初始化为一个的信号灯可以用作互斥锁,该信号灯最多只能使用一个许可。这通常被称为二进制信号量,因为它只有两种状态:一个许可可用,或零许可可用。当以这种方式使用时,二进制信号量具有属性(与许多Lock实现不同),该“锁”

  • 问题内容: 我正在使用Java进行编译器设计项目。进行了词法分析(使用jflex),我想知道哪种yacc类工具最适合(最有效,最易用等)进行语法分析,为什么这样做。 问题答案: 如果您特别想要类似YACC的行为(表驱动),那么我所知道的唯一一个就是CUP。 在Java世界中,似乎有更多的人倾向于ANTLR或JavaCC之类的递归下降解析器。 而且效率很少是选择解析器生成器的原因。

  • 问题内容: Python Decorators是与Java注释或诸如Spring AOP或Aspect J之类的相同或相似,还是从根本上不同? 问题答案: Python装饰器只是语法糖,用于将一个函数传递给另一个函数并用结果替换第一个函数: 是语法糖 Java批注本身仅存储元数据,您必须进行检查以添加行为。 Java AOP系统是建立在Java之上的巨大事物,装饰器只是语言语法,几乎没有附加语义,

  • 假设我有一个数组< code>movies = get_movies() 在ruby中,我经常做或一些事情。 在Java中,我能做些什么类似的事情?同样优雅,简洁和可读。我知道我有很多方法可以做到这一点,但如果有一个很好的方法来做到这一点,这将使我不想使用Groovy或其他东西让我知道。我相信Java有一些很棒的方法来做这样的事情。 这是我迄今为止使用TheMovieDB API Java包装器的

  • 问题内容: 我正在寻找Java ByteBuffer的“ C ++”。 我可能会丢失明显的内容,或者仅需要一个孤立的用法示例进行澄清。我浏览了iostream家族,它似乎可以提供基础。具体来说,我希望能够: 从字节数组/点构建缓冲区,并从缓冲区获取原语,例如getByte,getInt 使用原语(例如putByte,putInt)构建缓冲区,然后获取字节数组/指针。 问题答案: 您已经拥有,或者可