2014-10-27 3 views
2

Я использую dropwizard для микросервиса. Я хочу передать объект на принимающей стороне.Dropwizard не принимает @PathParam для объектов pojo

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

Вот отчет простой 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

, но когда я пытаюсь запустить программу из затмения. это дает мне ошибку. Мне нужно добавить внешний банку здесь. Я предполагал, что мастер-паук делает все. И когда я меняю 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

ответ

3

Назад к основам. A параметр запроса - это элемент после вопросительного знака в URL-адресе, разделенный символом «&», например.

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

Вот два Params запроса, report и reportName. Вам никогда не придется отправлять сложный объект в запрос GET (что произойдет, если вы просто вставьте его в свою адресную строку). Как вы, вероятно, можете сказать, эти параметры запроса легко анализировать так долго и последовательно. Поэтому никаких сложных объектов в качестве параметров запроса нет.

A параметр пути - это элемент в пределах URL-адреса, например.

yourwebsite.com/run/1 

Здесь есть один параметр пути, «1». Это параметр пути, потому что он является частью фактического пути, это не дополнительная информация, предоставляемая как в параметрах запроса (которые обычно являются необязательными).

Вы должны отправить сложный объект (например, ваш отчет) в запрос типа POST или PUT, где вы сообщаете серверу о необходимости обновления и предоставления нескольких значений.

Итак, вы объяснили, что хотите передать объект на принимающую сторону. Для этого вам лучше всего изменить аннотацию @GET на @POST, путь может оставаться неизменным. Но вы не будете включать свой сложный объект в качестве параметра запроса. Вместо этого он должен быть опубликован как json. Dropwizard должен выполнить десериализацию, указав имена свойств. Так что ваша точка может выглядеть так:

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

Пример Запрос на это было бы выполнить POST к yourwebsite.com/run с JSON как:

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

Также обратите внимание, что свойства вашего отчета класса должны быть аннотируется @JsonProperty для десериализации. Если что-то неясно, оставьте комментарий, и я могу попытаться помочь.

+0

Я согласен с каждым, что вы говорите, только один вопрос. Представьте, что он установил маршрут с помощью/run/{id}. Затем будет отчет о протоколе @PathParam («id»). Где запрос запрашивается идентификатором и вводится в метод. Вместо того, чтобы получать идентификатор как строку и получать вручную? –

+0

@j_walker_dev - Не могли бы вы перефразировать свой вопрос? Я не уверен, что вас спрашивают! Я понимаю сценарий, который вы объясняете о запуске id, а затем не уверен ... :) –