2014-10-27 65 views
2

我正在使用dropwizard進行微服務。我想在接收端傳遞一個對象。Dropwizard不接受pojo對象的@PathParam

@GET 
@Path("/run") 
public String runReport(@PathParam(value = "report") Report report){ 
    return "Report Service is running: Status good"; 
} 

在這裏報告是

@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中運行該程序定義一個簡單的POJO。它給了我錯誤。我需要在這裏添加一些外部的jar。我推測下降嚮導會做所有事情。並且,當我將PathParam從報告更改爲簡單長時,它運行正常

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- 
[email protected]==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 
+0

如果要將數據傳輸到服務器,請使用POST而不是GET。 – user3280180 2014-10-31 08:43:09

回答

3

返回基礎。 A 查詢參數是URL中的問號之後的項目,由「&」符號分隔,例如,

yourwebsite.com/run?report=1&reportName=dogs 

這裏有兩個查詢參數,reportreportName。您不應該在GET請求中發送複雜的對象(如果您只是將其粘貼到地址欄中,會發生什麼情況)。正如你可能知道的那樣,這些查詢參數很容易解析和字符串。所以沒有複雜的對象作爲查詢參數。

A 路徑參數是URL中的項目,例如,

yourwebsite.com/run/1 

這裏有一個路徑參數,「1」。這是一個路徑參數,因爲它是實際路徑的一部分,並不像查詢參數(通常是可選的)那樣提供額外的信息。

您應該在POST或PUT等請求中發送一個複雜對象(如報告),告訴服務器更新某些內容並提供多個值。

所以,你已經解釋過你想傳遞一個對象給接收端。爲此,最好將@GET註釋更改爲@POST,路徑可以保持不變。但是,您不會將複雜對象包含爲查詢參數。相反,它應該發佈爲json。 Dropwizard應該執行反序列化,提供屬性名稱匹配。所以,你的終點可以看起來像這樣:

@POST 
@Path("/run") 
public String runReport(Report report) { 
    // 
} 

一個例子請求這將是使用JSON進行POSTyourwebsite.com/run像:

{ 
    serialVersionUID: 1, 
    hashCode: 1, 
    description: "xxx" 
} 

另外請注意,在你的報告類的屬性應該是用@JsonProperty進行註釋以反序列化。如果有什麼不清楚的地方,留下評論,我可以嘗試幫助。

+0

我同意你所說的每一句話,只有一個問題。假設他使用/ run/{id}設置了正確的路線。然後將@PathParam(「id」)報告報告確定。何處該報告由ID查詢並注入該方法。而不是獲得作爲一個字符串的id和手動進入? – 2014-11-03 02:45:51

+0

@j_walker_dev - 你能否重新說出你的問題?我不確定有什麼問題!我瞭解你解釋的關於通過id跑步然後不確定的場景...... :) – 2014-11-03 09:48:44