当前位置: 首页 > 面试题库 >

如果名称变量带有下划线前缀,则Bean验证不起作用

应煌
2023-03-14
问题内容

我正在尝试一些bean验证,并且绊倒了“奇怪”的行为。我正在使用Glassfish和Primefaces作为前端(如果有任何区别)。在我项目的其他地方,我使用了Hibernate-
validator,我不确定它是否在验证JSF(否则,它是Glassfish中的默认值)。我有一个托管bean:

@javax.faces.bean.ManagedBean
@javax.faces.bean.ViewScoped
public class TestBean
{
    @Size(min=8)
    private String _testString;

    public String getTestString()
    {
        return _testString;
    }

    public String setTestString(String testString)
    {
        _testString = testString;
    }

    public void doSomethind()
    {
        // Do something with the test string
    }
}

还有一个包含以下内容的JSF页面:

<h:form id="testForm">
    <h:outputLabel for="testInput" value="Input:"/>
    <p:inputText id="testInput" value="#{testBean.testString}"/>
    <p:message id="testInputMsg" for="testInput"/>
    <p:commandButton value="Aanmaken" action="#{testBean.doSomething}" update="@form"/>
</h:form>

_testString没有得到验证这种方式。但是,当我将字段更改为以下内容时,bean验证确实起作用:

@Size(min=8)
private String testString;

或当我代替现场注释吸气剂时:

private String _testString;

@Size(min=8)
public String getTestString()
{
    return _testString;
}

遵循我们的编码准则,我们必须在私有字段前面加上下划线。这给了我一个选择。注释吸气剂。

有人可以解释一下为什么它会这样吗?


问题答案:

根据JSR
303规范

3.2。约束声明

约束声明主要通过注释放置在类或接口上。约束注释(请参阅第2.1节)可以应用于类型,任何类型的字段或任何与 JavaBeans兼容的 属性。

(强调我的)

根据JavaBeans规范:

8.3.1简单属性

默认情况下,我们使用设计模式通过查找以下形式的方法来定位属性:

public <PropertyType> get<PropertyName>();
public void set<PropertyName>(<PropertyType> a);

因此,属性名称为_testString,它正在寻找一个名为getter / setter的getter / setter
get_testString()set_testString()在您的情况下不存在。

您的代码准则与JavaBeans规范冲突,因此,当您将注释放在名称与JavaBeans规范冲突的属性上时,JSR-303
bean验证将根本无法工作。JSR-303找不到与属性名称关联的getter / setter,因此在调用它们时将无法执行验证。

修改代码准则以符合标准,或者将注释放在getter上并使用它。另请参见标准Java代码约定。



 类似资料:
  • 问题内容: JavaScript中的下划线前缀仅是约定,例如Python私有类方法中的约定吗? 从2.7 Python文档中: Python中不存在只能从对象内部访问的“私有”实例变量。但是,大多数Python代码遵循一个约定:以下划线开头的名称(例如_spam)应被视为API的非公开部分(无论是函数,方法还是数据成员) 。 这也适用于JavaScript吗? 以下面的JavaScript代码为例

  • 问题内容: 即使在今天,我经常在Java变量和方法中看到下划线,例如成员变量(例如“ m_count”或“ _count”)。据我所记得,在这种情况下使用下划线被Sun称为坏样式。 应该使用它们的唯一位置是常量(例如“ public final static int IS_OKAY = 1;”中的常量),因为常量应该全部为大写而不是驼峰式。在这里,下划线应使代码更具可读性。 您认为在Java中使用

  • 问题内容: 我正在使用go,特别是QT绑定。但是,我不理解以下结构中前导下划线的使用。我知道一般使用下划线,但不知道此特定示例。 它与struct标签有关吗? 问题答案: 这些称为空白字段,因为空白标识符用作字段名称。 不能引用它们(就像任何以空白标识符作为名称的变量一样),但它们会参与结构的内存布局。通常,实际上,它们被用作填充,以将后续字段与字节位置(或内存位置)对齐,以匹配来自(或进入)另一

  • 我正在尝试利用Laravel的登录页路径。例如,默认情况下,Laravel会将您带到欢迎页面,并且斜杠后没有url文本。 在我的欢迎页面中,我使用以下条件根据路线名称应用样式。 然而,此代码不工作。如何正确查看欢迎页面的路线? 编辑:使用“请求”而不是“路由”使其工作。然而,为了保持一致性,我想知道是否也可以使用“路线”来完成。

  • 我想在Spring Boot应用程序中设置。我想使用环境变量来设置它。 Spring Boot相当方便地将所有环境变量从转换为Spring上下文中称为的属性。 如何在Spring Boot中使用环境变量设置目标名称中有下划线的属性?大概会被翻译成?

  • 问题内容: 问题是阿拉伯文字未打印-请谁能解决我的问题? 问题答案: 删除并将编码更改为,这应该使您的字符