2014-10-29 70 views
0

我們剛剛啓動了一個新項目,並正在研究用於kickstarting我們的開發的spring-boot。 春季引導看起來很強大,但是還有一些我們還不明白的魔法。spring-boot-jersey does not autodiscover jersey-media-moxy

我克隆了spring-boot示例並運行了Jersey示例。 https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-jersey 到目前爲止好。

然後,我將其轉換爲Groovy/Gradle。構建腳本的

相關的部分看起來像這樣

. 
. 
buildscript { 
    repositories { 
     jcenter() 
//  maven { url "http://repo.spring.io/snapshot" } 
     maven { url "http://repo.spring.io/milestone" } 
    } 
    dependencies { 
     classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.0.M2") 
     classpath 'org.springframework:springloaded:1.2.0.RELEASE' 
    } 
} 
. 
. 
apply plugin: 'spring-boot' 
. 
. 
dependencies { 
    compile project(':domain') 
    compile "org.springframework.boot:spring-boot-starter-jersey", 
      "org.glassfish.jersey.media:jersey-media-moxy:2.13", 
      "org.springframework:spring-webmvc" 
} 

運行時的gradle bootRun服務器啓動時,樣品在端點資源都在工作。

不,我想我的序列化的域對象到JSON,創建一個類PersonResource

@Component 
@Path("/internal/v1/core/person") 
class PersonResource { 

    @GET 
    def hello() { 
     "hello" 
    } 

    @GET 
    @Path("/greet/{firstName}") 
    String greet(@PathParam('firstName') String firstName) { 
     def p = Person.findByFirstName(firstName) 
     return p ? "Hello ${p.firstName}!" : "Person not found" 
    } 

    @GET 
    @Path("/{firstName}") 
    @Produces(APPLICATION_JSON) 
    def getPerson(@PathParam('firstName') String firstName) { 
     def p = Person.findByFirstName(firstName) 
     if (p) { 
      return p 
     } else { 
      return Response.status(NOT_FOUND).build() 
     } 
    } 


    @POST 
    @Path("{firstName},{lastName}") 
    Response addPerson(@PathParam('firstName') String firstName, @PathParam('lastName') String lastName) { 
     Person.withTransaction { 
      def p = new Person(firstName: firstName, lastName: lastName).save() 
      if (p) { 
       return Response.created().build() 
      } else { 
       return Response.status(BAD_REQUEST).build() 
      } 
     } 
    } 


} 

運行示例的時候,我使用curl創建新的聯繫人。見的最後一個方法 - > addPerson的

當訪問了「打招呼」的資源,這也工作正常,返回一個字符串

然而,試圖返回使用「getPerson」方法的人的JSON represenation時,這種失敗

java.lang.NoClassDefFoundError: org/glassfish/jersey/internal/inject/SecurityContextInjectee 
    at org.glassfish.jersey.server.ServerBinder.configure(ServerBinder.java:190) 
    at org.glassfish.hk2.utilities.binding.AbstractBinder.bind(AbstractBinder.java:171) 
    at org.glassfish.jersey.internal.inject.Injections.bind(Injections.java:154) 
    at org.glassfish.jersey.internal.inject.Injections._createLocator(Injections.java:144) 
    at org.glassfish.jersey.internal.inject.Injections.createLocator(Injections.java:123) 
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:303) 
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:284) 
    at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:311) 
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:168) 
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:358) 
    at javax.servlet.GenericServlet.init(GenericServlet.java:158) 
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284) 
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:884) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:134) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.proceractProtocol.java:611) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1736) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1695) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:744) 
Caused by: java.lang.ClassNotFoundException: org.glassfish.jersey.internal.inject.SecurityContextInjectee 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    ... 28 common frames omitted 

我已經添加了 「org.glassfish.jersey.media:jersey-media-moxy:2.13」 作爲依賴,根據新澤西州2個文檔

https://jersey.java.net/documentation/latest/media.html#json.moxy

這應該是自發現功能,所以這應該無需registrating MOXY爲特徵

所以,我想,也許這是關係到my other issues with spring-boot-jersey and gradle工作? 所以要排除這種可能性,並添加下面的彈簧引導樣品球衣代碼

public class Person { 

    public String firstName; 
    public String lastName; 
} 

@GET 
    @Path("/person") 
    @Produces(APPLICATION_JSON) 
    public Person person() { 
     Person p = new Person(); 
     p.firstName = "Elvis"; 
     p.lastName = "Presley"; 
     return p; 
    } 

和聚甲醛

<dependency> 
      <groupId>org.glassfish.jersey.media</groupId> 
      <artifactId>jersey-media-moxy</artifactId> 
      <version>2.13</version> 
     </dependency> 

然而,這也失敗了,雖然有不同的異常

java.lang.NoClassDefFoundError: org/glassfish/hk2/api/ServiceLocatorFactory$CreatePolicy 
    at org.glassfish.jersey.internal.inject.Injections._createLocator(Injections.java:138) 
    at org.glassfish.jersey.internal.inject.Injections.createLocator(Injections.java:123) 
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:303) 
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:284) 
    at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:311) 
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:168) 
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:358) 
    at javax.servlet.GenericServlet.init(GenericServlet.java:158) 
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284) 
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:884) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:134) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1736) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1695) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:744) 

我錯過了這裏明顯的東西? 或者這是春季靴子球衣的問題?

回答

1

您試圖使用版本2.13的jersey-media-moxy與Boot 1.2.0.M2。 Boot 1.2.0.M2使用其他Jersey模塊的版本2.7。回到jersey-media-moxy模塊的2.7應該可以解決這個問題。或者,Boot的最新1.2.0快照現在使用Jersey 2.13,因此您可以將引導依賴關係更新爲1.2.0.BUILD-SNAPSHOT

+0

這解決了我最初的問題。但是,當返回來自球衣資源的關係/集合的更復雜的領域實體時,將返回404。而且沒有從404上的球衣提供的日誌記錄,所以我必須深入瞭解這一點。 (球衣記錄其他東西,但不是這個) – runeaen 2014-10-30 08:14:18