对 Rest、JSF、业务层使用相同的验证逻辑
Using same validation logic for Rest, JSF, biz layer
我想知道是否有一种方法,如果有,正确的方法是在 EJB bean 中为 JSF 使用相同的验证逻辑(一个实现)和网络服务 - 休息(RestEasy)。
目前所有层都使用 Hibernate 实体,因为我觉得我的项目太小,无法在表示层上使用额外的 DTO 使其复杂化,但其余服务将使用 DTO。
我该如何解决这个问题?
谢谢!
Java EE 正是为此目的提供了 JSR303 Bean 验证 API。 @NotNull
和朋友们,您可能已经在附近见过他们了。默认情况下,这会被 JSF 和 JPA 自动识别和支持。 JAX-RS 通常没有应该 take/validate 输入的 "view",因此这里不相关。
所以,而不是例如JSF
<h:inputText value="#{bean.entity.property}" required="true" />
只有
private String property;
你可以直接使用
<h:inputText value="#{bean.entity.property}" />
和
@NotNull
private String property;
如果您通过 JAX-RS 放置数据,JPA 也可以使用它。
在 JSF 方面您唯一需要考虑的是它默认将空字段设置为空字符串而不是 null
。您使用以下 web.xml
上下文参数告诉 JSF 将提交的空字符串值解释为 null
:
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
另请参阅:
- Java EE 7 tutorial - using Bean Validation constraints
- Empty input value does not triggger @NotNull but it triggers @NotBlank
我想知道是否有一种方法,如果有,正确的方法是在 EJB bean 中为 JSF 使用相同的验证逻辑(一个实现)和网络服务 - 休息(RestEasy)。
目前所有层都使用 Hibernate 实体,因为我觉得我的项目太小,无法在表示层上使用额外的 DTO 使其复杂化,但其余服务将使用 DTO。
我该如何解决这个问题?
谢谢!
Java EE 正是为此目的提供了 JSR303 Bean 验证 API。 @NotNull
和朋友们,您可能已经在附近见过他们了。默认情况下,这会被 JSF 和 JPA 自动识别和支持。 JAX-RS 通常没有应该 take/validate 输入的 "view",因此这里不相关。
所以,而不是例如JSF
<h:inputText value="#{bean.entity.property}" required="true" />
只有
private String property;
你可以直接使用
<h:inputText value="#{bean.entity.property}" />
和
@NotNull
private String property;
如果您通过 JAX-RS 放置数据,JPA 也可以使用它。
在 JSF 方面您唯一需要考虑的是它默认将空字段设置为空字符串而不是 null
。您使用以下 web.xml
上下文参数告诉 JSF 将提交的空字符串值解释为 null
:
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
另请参阅:
- Java EE 7 tutorial - using Bean Validation constraints
- Empty input value does not triggger @NotNull but it triggers @NotBlank