Resteasy Bean验证在远程服务器上不起作用



我有一个类似于这里描述的问题。

我在一个独立的Jetty应用程序中使用restasy。当我在本地启动应用程序并调用服务(例如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。这是最终版本,不过我也尝试过更早的版本。我试过编写我的自定义验证器,但也不起作用。

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

由于您使用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/*");
}

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

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

restasy通过查找可用的META-INF/services/javax.ws.rs获得bean验证实现。实现ContextResolver的提供程序文件

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

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

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

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

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

最新更新