java - Dropwizard 不接受 pojo 对象的 @PathParam

标签 java dropwizard

我正在使用 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

这里有两个查询参数,reportreportName。您永远不必在 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/

相关文章:

java - 在 Apache POI 中,有没有办法通过 id 访问 XWPF 元素的 id?

java - 为什么我的线程不同步?

java - Jersey 客户端关闭 InputStream 响应 - 它真的有效吗?

java - java中未找到文件text.properties

java - 使用纯 Java 和 Springboot 在 Vaadin 中更改 FavIcon

java - 如何在 ssl 的 java 应用程序服务器中禁用弱密码套件

java - 从输入流读取实体时出错 Dropwizard 示例

servlets - Dropwizard:设置 servlet 上下文参数

java - Dropwizard bean 验证不起作用

java - 如何使用 Dropwizard 解析 RESTful API 参数