原文: https://howtodoinjava.com/resteasy/jax-rs-custom-validation-example-using-ajax/

    在此示例中,我将显示ValidatorAdapter@ValidateRequest注解的结合使用。 为了从 UI 发送请求,我将使用 ajax。 您可以在项目中使用表单提交。 在这种情况下,您将需要@FormParam注解来捕获请求参数。

    在下面的功能截图中,我们将在本教程中实现。

    使用 Ajax 的 JAX-RS 自定义验证示例 - 图1

    JAX-RS + Ajax 验证示例

    让我们逐步构建此示例教程。

    步骤 1)使用 Maven 创建一个 Eclipse Web 项目

    1. C:LokeshSetupworkspaceRESTfulValidation>mvn archetype:generate -DgroupId=com.howtodoinjava
    2. -DartifactId=RESTfulValidation -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
    3. mvn eclipse:eclipse -Dwtpversion=2.0

    步骤 2)更新pom.xml文件中的运行时依赖项

    1. <!-- core library -->
    2. <dependency>
    3. <groupId>org.jboss.resteasy</groupId>
    4. <artifactId>resteasy-jaxrs</artifactId>
    5. <version>2.3.1.GA</version>
    6. </dependency>
    7. <dependency>
    8. <groupId>net.sf.scannotation</groupId>
    9. <artifactId>scannotation</artifactId>
    10. <version>1.0.2</version>
    11. </dependency>
    12. <!-- JAXB provider -->
    13. <dependency>
    14. <groupId>org.jboss.resteasy</groupId>
    15. <artifactId>resteasy-jaxb-provider</artifactId>
    16. <version>2.3.1.GA</version>
    17. </dependency>

    步骤 3)使用路径映射信息更新web.xml

    1. <!DOCTYPE web-app PUBLIC
    2. "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    3. "http://java.sun.com/dtd/web-app_2_3.dtd" >
    4. <web-app>
    5. <display-name>Archetype Created Web Application</display-name>
    6. <!-- Auto scan REST service -->
    7. <context-param>
    8. <param-name>resteasy.scan</param-name>
    9. <param-value>true</param-value>
    10. </context-param>
    11. <listener>
    12. <listener-class>
    13. org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
    14. </listener-class>
    15. </listener>
    16. <servlet>
    17. <servlet-name>resteasy-servlet</servlet-name>
    18. <servlet-class>
    19. org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
    20. </servlet-class>
    21. </servlet>
    22. <servlet-mapping>
    23. <servlet-name>resteasy-servlet</servlet-name>
    24. <url-pattern>/rest/*</url-pattern>
    25. </servlet-mapping>
    26. </web-app>

    步骤 4)创建将在其上执行验证的 RESTful API

    该 API 在以下级别可以具有@ValidateRequest注解:

    • 方法级别:它将启用对该特定方法的验证。
    • 类级别:它将在该类内的所有方法上启用验证。

    我在类上使用此注解。

    1. package com.howtodoinjava.rest;
    2. import javax.ws.rs.POST;
    3. import javax.ws.rs.Path;
    4. import javax.ws.rs.QueryParam;
    5. import javax.ws.rs.core.Response;
    6. import org.jboss.resteasy.spi.validation.ValidateRequest;
    7. @Path("/rest")
    8. @ValidateRequest
    9. public class UserService {
    10. @Path("/users")
    11. @POST
    12. public Response addUser(@QueryParam("firstName") String firstName, @QueryParam("lastName") String lastName)
    13. {
    14. System.out.println("User added !!");
    15. return Response.ok().build();
    16. }
    17. }

    注意:如果已在类级别使用@ValidateRequest注解,并且想要禁用某些 API 的验证,则可以使用@DoNotValidateRequest注解。

    步骤 5)创建您的自定义验证器,该实现器将实现ValidatorAdapter

    ValidatorAdapter的实现在应用启动时由 RESTEasy 自动扫描,并在上下文中注册。

    1. package com.howtodoinjava.validator;
    2. import java.lang.reflect.Method;
    3. import org.jboss.resteasy.spi.BadRequestException;
    4. import org.jboss.resteasy.spi.validation.ValidatorAdapter;
    5. public class CommonValidator implements ValidatorAdapter {
    6. @Override
    7. public void applyValidation(Object resource, Method invokedMethod, Object[] args)
    8. {
    9. /*ValidateRequest classLevelValidateRequest = FindAnnotation.findAnnotation(invokedMethod.getDeclaringClass()
    10. .getAnnotations(), ValidateRequest.class);
    11. ValidateRequest methodLevelValidateRequest = FindAnnotation.findAnnotation(invokedMethod.getAnnotations(), ValidateRequest.class);
    12. boolean applyValidation = (classLevelValidateRequest != null || methodLevelValidateRequest != null);*/
    13. if( invokedMethod.getName().equalsIgnoreCase("addUser"))
    14. {
    15. if(args == null || args.length != 2)
    16. {
    17. throw new BadRequestException("Fill all fields");
    18. }
    19. if(((String) args[0]).isEmpty())
    20. {
    21. throw new BadRequestException("Fill first name");
    22. }
    23. else if(((String) args[1]).isEmpty())
    24. {
    25. throw new BadRequestException("Fill last name");
    26. }
    27. }
    28. }
    29. }

    步骤 6)修改index.jsp文件以与 REST API 交互

    该 jsp 文件将包含带有两个输入框的 HTML 表单。 这些文本框将接受用户的名字和姓氏。 我们正在尝试在此表单上启用 ajax 支持的验证功能。

    1. <html>
    2. <head>
    3. <script lang="javascript">
    4. var xmlhttp;
    5. function postRequest(url, cfunc) {
    6. if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
    7. xmlhttp = new XMLHttpRequest();
    8. } else {// code for IE6, IE5
    9. xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    10. }
    11. xmlhttp.onreadystatechange = cfunc;
    12. xmlhttp.open("POST", url, true);
    13. xmlhttp.send();
    14. }
    15. function submitForm() {
    16. postRequest(
    17. "./rest/users?firstName="+document.getElementById("firstName").value+"&lastName="+document.getElementById("lastName").value,
    18. function() {
    19. if (xmlhttp.readyState == 4 && xmlhttp.status != 200) {
    20. //alert(xmlhttp.responseText);
    21. document.getElementById("error").innerHTML = "<h2><span style='color:red'>Fill all fields !!</span></h2>";
    22. }
    23. });
    24. }
    25. </script>
    26. </head>
    27. <body>
    28. <h1>JAX-RS Custom Validation</h1>
    29. <div id="error"></div>
    30. <form onclick="submitForm()" method="post">
    31. <p>
    32. First Name : <input type="text" name="firstName" id="firstName"/>
    33. </p>
    34. <p>
    35. LastName : <input type="text" name="lastName" id="lastName"/>
    36. </p>
    37. <input type="button" value="Add User" />
    38. </form>
    39. By :
    40. <b>https://www.howtodoinjava.com</b>
    41. </body>
    42. </html>

    步骤 7)测试应用

    尝试提交项目或半填表时,您会收到验证错误,如帖子开头的屏幕截图所示。 另外,在服务器日志中,您可以验证错误记录为:

    1. SEVERE: Failed executing POST /rest/users
    2. org.jboss.resteasy.spi.BadRequestException: Fill first name
    3. at com.howtodoinjava.validator.CommonValidator.applyValidation(CommonValidator.java:30)
    4. at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:150)
    5. at org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:257)
    6. at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:222)
    7. at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:211)
    8. at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:525)
    9. at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:502)
    10. at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:119)
    11. at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208)
    12. at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55)
    13. at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50)
    14. at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    15. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    16. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    17. at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    18. at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    19. at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    20. at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    21. at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    22. at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
    23. at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    24. at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    25. at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    26. at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    27. at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    28. at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    29. at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    30. at java.lang.Thread.run(Unknown Source)

    学习愉快!