我正在使用 dropwizard 进行微服务。我想在接收端传递一个对象。
@GET
@Path("/run")
public String runReport( @PathParam(value = "report") Report report){
return "Report Service is running: Status good";
}
这里的 Report 是一个简单的 pojo,定义为
@JsonIgnoreProperties(ignoreUnknown = true)
public class Report {
private static final long serialVersionUID = -558913649L;
/** hashCode temporary storage. */
private volatile Integer hashCode;
/** Field mapping. */
private String description;
}
我使用的是 dropwizard 版本 0.7.1
但是当我尝试从 eclipse 运行该程序时。它给了我错误。我需要在此处添加一些外部 jar 吗?我认为下降向导可以完成一切。当我将 PathParam 从报告更改为简单的 long 时,它运行正常
ERROR [2014-10-27 18:24:54,792] com.sun.jersey.spi.inject.Errors: The following errors and
warnings have been detected with resource and/or provider classes:
SEVERE: Missing dependency for method public java.lang.String
com.sdata.report.resources.ReportResource.runReport(com.sdata.report.resources.Report) at
parameter at index 0
Exception in thread "main" javax.servlet.ServletException:
com.sun.jersey.spi.container.servlet.ServletContainer-
68792330@565a8b6c==com.sun.jersey.spi.container.servlet.ServletContainer,1,false
at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:561)
at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:349)
at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:812)
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:288)
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:732)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69)
at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:118)
at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:100)
at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:60)
at com.codahale.metrics.jetty9.InstrumentedHandler.doStart(InstrumentedHandler.java:92)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69)
at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:118)
at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:100)
at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:60)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69)
at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:118)
at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:100)
at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:60)
at org.eclipse.jetty.server.handler.RequestLogHandler.doStart(RequestLogHandler.java:131)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69)
at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:118)
at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:100)
at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:60)
at org.eclipse.jetty.server.handler.StatisticsHandler.doStart(StatisticsHandler.java:233)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69)
at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:118)
at org.eclipse.jetty.server.Server.start(Server.java:342)
at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:100)
at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:60)
at org.eclipse.jetty.server.Server.doStart(Server.java:290)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69)
at io.dropwizard.cli.ServerCommand.run(ServerCommand.java:43)
at io.dropwizard.cli.EnvironmentCommand.run(EnvironmentCommand.java:43)
at io.dropwizard.cli.ConfiguredCommand.run(ConfiguredCommand.java:76)
at io.dropwizard.cli.Cli.run(Cli.java:70)
at io.dropwizard.Application.run(Application.java:72)
at com.sdata.report.ReportApplication.main(ReportApplication.java:12)
Caused by: com.sun.jersey.spi.inject.Errors$ErrorMessagesException
at com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170)
at com.sun.jersey.spi.inject.Errors.postProcess(Errors.java:136)
at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:199)
at
com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:795)
at
com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:790)
at com.sun.jersey.spi.container.servlet.ServletContainer.initiate(ServletContainer.java:491)
at
at com.sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.java:605)
at com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:207)
at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:376)
at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:559)
at javax.servlet.GenericServlet.init(GenericServlet.java:244)
at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:540)
... 36 more
WARN [2014-10-27 18:24:54,795] /: unavailable
最佳答案
回到基础。 查询参数是网址中问号后面的一项,由“&”符号分隔,例如
yourwebsite.com/run?report=1&reportName=dogs
这里有两个查询参数,report
和 reportName
。您永远不必在 GET 请求中发送复杂的对象(如果您将其粘贴到地址栏中会发生什么)。正如您可能知道的那样,这些查询参数很容易解析为长字符串。因此没有复杂的对象作为查询参数。
路径参数是网址中的一个项目,例如
yourwebsite.com/run/1
这里有一个路径参数,“1”。它是一个路径参数,因为它是实际路径的一部分,它不是像查询参数(通常是可选的)那样提供的额外信息。
您应该在 POST 或 PUT 之类的请求中发送一个复杂的对象(例如您的报告),告诉服务器更新某些内容并提供多个值。
所以,您已经解释过您想要将一个对象传递到接收端。为此,您最好将@GET
注释更改为@POST
,路径可以保持不变。但是您不会将复杂对象作为查询参数包含在内。相反,它应该以 json 形式发布。 Dropwizard 应该执行反序列化,前提是属性名称匹配。因此您的端点可能如下所示:
@POST
@Path("/run")
public String runReport(Report report) {
//
}
对此的示例请求是使用如下 json 对 yourwebsite.com/run
执行 POST
:
{
serialVersionUID: 1,
hashCode: 1,
description: "xxx"
}
另请注意,Report 类中的属性应使用 @JsonProperty
进行注释才能反序列化。如果有任何不清楚的地方,请发表评论,我可以尽力提供帮助。
关于java - Dropwizard 不接受 pojo 对象的 @PathParam,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26594394/