我遇到类似于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,虽然我也尝试过早期版本。我曾尝试编写自定义验证器,但这也无效。
我很困惑为什么验证在本地工作,但不在远程服务器上。任何建议都将受到高度赞赏。
答案 0 :(得分:1)
由于您将Jetty用作独立服务器,因此您必须定义RESTEasy验证提供程序,您可以在其中定义ServletContextHandler
。请注意,在独立服务器中,没有容器可以扫描@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
RESTEasy通过查找可用的META-INF / services / javax.ws.rs.Providers文件来获取bean验证实现,以获取ContextResolver的实现
所以它没有说什么,但在哪里说。现在打开“resteasy-hibernatevalidator-provider-3。。。*。jar(来自Eclipse - &gt; 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等),您还可以添加其他提供程序。