当前位置: 首页 > 知识库问答 >
问题:

REST函数中的两个以上参数导致Jersey 2.0/JAXB 2.2中的ModelValidationException

魏俊茂
2023-03-14

我有一个问题,我真的无法摆脱。我正在使用嵌入在Eclipse中的玻璃鱼4.0以及JAXB 2.2和泽西岛2.0。我想创建一个REST接口,其中泽西调用的函数需要两个参数。例如,两个路径参数或 JAXB 和一个路径参数的混合。无论哪种方式,我总是得到一个模型验证例外与泽西岛。在函数中只注入一个参数效果很好,但我至少需要两个,有时甚至更多。

我发现这个帖子是关于多部分表单数据的Jersey 2注入源的,但我认为这不是我的解决方案,因为我正在处理GET、POST甚至PUT,不想使用表单数据。最后,不管我使用PUT、POST还是get,我总是得到相同的错误。当然,我可以使用

@Context UriInfo info;

信息,并使用例如

long portID = new Long(uriInfo.getPathParameters().get("portid").get(0));

看来我必须通过玻璃鱼激活某个功能才能激活这个功能。

这是我的代码的一个例子,它不工作

@PUT
@Path("/networkelements/{neid: [0-9]+}/ports/clients/{portid: [0-9]+}")
@Consumes(MediaType.APPLICATION_XML)
public Response fullyUpdateClientPort(@PathParam("neid") long neID, @PathParam("portid") long portID, Ports ports){
    // TODO: Implement REST functionality
    return Response.status(Response.Status.OK).entity("Port(s) fully updated").build();
}

一个很好的例子:

@GET
@Path("/networkelements/{neid: [0-9]+}/ports/clients/")
@Produces(MediaType.APPLICATION_XML)
public Ports getClientPorts(@PathParam("neid") Long neID){
    // TODO: Implement REST functionality
    Ports ports = new Ports();
    for (AbstractPort port : this.data.getPortList()) {
        DebugLogger.get().log(Level.INFO, port.getPortName());
    }
    ports.setPorts(this.data.getPortList());
    return ports;
}

编辑:这些是我得到的例外

2014-04-28T17:16:21.811+0200|SEVERE: WebModule[/SDNController]StandardWrapper.Throwable
java.lang.IllegalStateException: The resource configuration is not modifiable in this context.
at org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:257)
at org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:205)
at org.glassfish.jersey.server.ResourceConfig.register(ResourceConfig.java:435)
at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:261)
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:167)
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:349)
at javax.servlet.GenericServlet.init(GenericServlet.java:244)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1583)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:1225)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:237)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
at java.lang.Thread.run(Thread.java:745)

2014-04-28T17:16:21.811+0200|WARNING: StandardWrapperValve[de.dhbw_stuttgart.sdncontroller.core.services.restresources.ApplicationConfig]: Allocate exception for servlet de.dhbw_stuttgart.sdncontroller.core.services.restresources.ApplicationConfig
java.lang.IllegalStateException: The resource configuration is not modifiable in this context.
at org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:257)
at org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:205)
at org.glassfish.jersey.server.ResourceConfig.register(ResourceConfig.java:435)
at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:261)
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:167)
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:349)
at javax.servlet.GenericServlet.init(GenericServlet.java:244)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1583)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:1225)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:237)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
at java.lang.Thread.run(Thread.java:745)

编辑编号2:

我现在发现,不幸的是,我在URL中的参数没有被自动解码。我已经通过谷歌搜索了很多,但我还没有发现,如果我必须单独激活的东西,新泽西或Glassfish自动到这一点。通过UriInfo获取这些参数可以很好地工作,并且是目前唯一的解决方法。

共有1个答案

夏飞鹏
2023-03-14

当初始化 API 时出现问题时,通常会引发此异常。不一定是导致异常弹出的请求。

尝试查看容器通用日志。尽可能多地评论初始化部分,直到它起作用。尝试思考初始化期间是否执行了一些代码。

 类似资料:
  • 我试图在ReactJs中通过一个两个事件的动作,基本上我想要这样的东西 我尝试了1000种不同的语法编写方法 我的预期结果是,当用户单击按钮时,pro1将成为prop2,同时执行“this.continue()”。

  • 我正在用PowerShell编写一个脚本,在某个时候我需要在函数参数上使用ValidateSet。这是一个非常好的功能,但我需要的是更多的东西。 例如: 因此,此代码段允许我从列表中选择一个项目,如 然后将其打印到屏幕上。我想知道是否有可能允许选择多个值并将它们传递给来自一个验证集的函数,如下所示 也许有一个图书馆,或者我只是错过了一些东西,但我真的找不到一个解决方案。

  • 我整合了Swashbuckle。OData 3.2.0和Swashbuckle。我的WepAPI OData webservice中的Core 5.5.3来生成Swagger documentaion。当我试图访问swaggerendpoint(http://localhost:52460/swagger)时,我得到了下面的异常,这似乎是由一个函数(AppointmentsForUsers)引起的

  • 在TypeScript中,可以用“Rest参数”声明函数: 假设我声明了另一个调用的函数: 编译器产生以下消息: 提供的参数与调用目标的任何签名都不匹配:无法将类型“string”应用于类型为“string[]”的参数2。 如何才能调用将提供的参数?

  • 我有一个api控制器操作,其中包含一个可选(且为空)参数。如果方法签名中存在此参数,则生成Swagger文档将失败,但如果将其从签名中删除,则生成成功。似乎可选参数是错误的原因,但我不知道为什么... 我正在使用Swashbuckle与ASPNET-API-Versioning的集成:https://github.com/microsoft/ASPNET-API-Versioning/wiki/S

  • 本文向大家介绍PowerShell函数中把参数传入另一个函数的函数传参例子,包括了PowerShell函数中把参数传入另一个函数的函数传参例子的使用技巧和注意事项,需要的朋友参考一下 本文介绍在自定义PowerShell函数时,可以使用@PSBoundParameters来将参数传递给另一函数。 下面,我们来创建一个Get-BIOS的函数, 在这个函数中,我们并没有作任何实际的操作,只是将输入的参