【问题标题】:Resteasy Bean Validation Not Working on Remote ServerResteasy Bean验证在远程服务器上不起作用
【发布时间】:2015-12-28 07:42:41
【问题描述】:

我遇到了与here 描述的类似的问题。

我在一个独立的 Jetty 应用程序中使用 RESTEasy。当我在本地启动应用程序并调用服务(例如 localhost:16880/rest/user/login)时,bean 验证工作正常,即我收到如下验证错误:

[PARAMETER]
[UserService#login(arg0).appKey]
[app_key may not be null or empty]
[]

但是,当我将应用程序部署到远程主机并调用相同的服务(例如 remotehost:16880/rest/user/login)时,根本不会调用 bean 验证。

我为服务使用@ValidateRequest注解,为bean参数使用@Valid注解。

我的 Resteasy 版本是 3.0.13.Final,虽然我也尝试过早期版本。我尝试编写自定义验证器,但也没有用。

我很困惑为什么验证在本地工作,而不是在远程服务器上。任何建议将不胜感激。

【问题讨论】:

    标签: rest jetty resteasy bean-validation


    【解决方案1】:

    由于您将 Jetty 用作独立服务器,因此您必须在定义 ServletContextHandler 的位置定义 RESTEasy 验证提供程序。请注意,在独立服务器中,没有容器可以扫描 @Provider 类并激活它们,因此您必须手动进行。

    我希望您创建并启动您的服务器应用程序:

    //create a server listening at some port
    Server server= new Server(port);
    
    //add server handlers
    HandlerList handlers= new HandlerList();
    initHandlers(handlers);
    server.setHandler(handlers);
    
    //start the server
    server.start();
    

    initHandlers 中,您必须已定义您的 RESTEasy 支持:

    public void initHandlers(List<HandlerList> handlers) {
        //define root context handler
        ServletContextHandler servletContextHandler= new ServletContextHandler(ServletContextHandler.SESSIONS);
        servletContextHandler.setContextPath("/");
        handlers.addHandler(servletContextHandler);
    
        //define RESTEasy handler
        ServletHolder restServlet= new ServletHolder(new HttpServlet30Dispatcher());
    
        //since this is a standalone server, somewhere you have to define RESTful services and Singletons
        restServlet.setInitParameter("javax.ws.rs.Application", "com.exampleapp.MyRestApplication");
        restServlet.setInitParameter("resteasy.servlet.mapping.prefix", "rest");
    
        servletContextHandler.addServlet(restServlet, "rest/*");
    }
    

    所以现在剩下要做的就是添加验证提供者作为初始化参数:

    restServlet.setInitParameter("resteasy.providers", "org.jboss.resteasy.plugins.validation.ValidatorContextResolver,org.jboss.resteasy.api.validation.ResteasyViolationExceptionMapper");
    

    在此链接上,我试图找到验证器提供者的名称:https://docs.jboss.org/resteasy/docs/3.0.4.Final/userguide/html/Validation.html

    RESTEasy 通过在可用的 META-INF/services/javax.ws.rs.Providers 文件中查找 ContextResolver 的实现来获得 bean 验证实现

    所以它不说是什么,而是说在哪里。现在打开“resteasy-hibernatevalidator-provider-3...*.jar(来自 Eclipse -> Maven 依赖项或手动解压缩)并查看 META-INF/services/javax.ws.rs。 ext.Providers 它说:

    org.jboss.resteasy.plugins.validation.hibernate.ValidatorContextResolver org.jboss.resteasy.api.validation.ResteasyViolationExceptionMapper

    如果你没有这个依赖,那么将它添加到你的 pom 文件中:

    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-hibernatevalidator-provider</artifactId>
        <version>${resteasy.version}</version>
    </dependency>
    

    另外请注意:在您描述验证提供程序的同一位置,您还可以添加其他提供程序,如果您碰巧需要它们(例如 JacksonJaxbJson 等)。

    【讨论】:

    • 完美,手动注册提供者(通过调用setInitParameter)是这里的关键。除此之外,我还必须将 表达式语言依赖项 添加到我的 pom 文件中。有关详细信息,请参阅here
    猜你喜欢
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 2015-10-15
    • 2015-10-17
    • 2013-06-05
    相关资源
    最近更新 更多