Java 如何使用Hibernate验证程序验证重写的方法参数?

Java 如何使用Hibernate验证程序验证重写的方法参数?,java,validation,constraints,hibernate-validator,Java,Validation,Constraints,Hibernate Validator,关于,我了解到,如果我有实现GroupManager并重写其方法的GroupService,那么我就不能使用验证约束进行注释,因为Hibernate Validator不允许使用它(结果被称为验证约束)。我的意思是做类似的事情 public class GroupService implements GroupManager{ @Override public List<String> findUsersInGroup(@NotNull String groupNa

关于,我了解到,如果我有实现GroupManager并重写其方法的GroupService,那么我就不能使用验证约束进行注释,因为Hibernate Validator不允许使用它(结果被称为验证约束)。我的意思是做类似的事情

public class GroupService implements GroupManager{

    @Override
    public List<String> findUsersInGroup(@NotNull String groupName) {
        ...
    }
}
public类GroupService实现GroupManager{
@凌驾
公共列表FindUsersingGroup(@NotNull字符串groupName){
...
}
}
然后会引发一个
ConstraintDeclarationException
,对吗?因此,解决方案显然是在接口上设置这些约束,但在这种情况下:

  • 我可能无法修改接口(在这种情况下,
    GroupManager
    属于
    Spring-Security
    )。那我怎么做呢
  • 我认为这些验证约束不应该影响接口,因为它们是接口实现的一部分,因此,如果我想要任何其他服务实现,我不应该将其连接到这些验证。也许有了这个新的验证,我想实现另一种验证,
    Hibernate-Validator
    迫使我“弄脏”接口
  • 我可能无法访问modificate接口(在这种情况下,GroupManager属于SpringSecurity)。在这种情况下我该怎么办

    您可以使用xml配置,因为JSR-303(Bean验证)支持它。例如

    <constraint-mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                         xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/mapping validation-mapping-1.0.xsd"
                         xmlns="http://jboss.org/xml/ns/javax/validation/mapping">
        <default-package>org.springframework.security.provisioning</default-package>
        <bean class="GroupManager" ignore-annotations="true">
            <method name="findUsersInGroup">
                <parameter type="java.lang.String">
                    <constraint annotation="javax.validation.constraints.NotNull"/>
                </parameter>
            </method>
        </bean>
    </constraint-mappings>
    
    在这种情况下,将使用合法的客户端代码

    Container container = ....;
    Element firstElement = container.getElements().iterator().next();
    
    因为契约说它返回一个非空集合

    如果我们更改javadoc并因此更改post条件

     /**
      * @return a collection of elements. 
      */
      public Collection<Element> getElements();
    
    /**
    *@返回元素集合。
    */
    公共集合getElements();
    
    以前合法的客户端代码将不再有效

    我只是做了这个例子来告诉你合同和方法签名之间的区别

    可以找到详细且非常好的解释

    由于GroupManager javadoc不限制该参数,因此法律impl必须处理所有情况'?这是验证方法中的参数吗

    对。如果接口没有对参数添加任何限制,则实现必须处理每个状态,因为客户端可能会传递参数 在任何州

     /**
      * @return a collection of elements. 
      */
      public Collection<Element> getElements();