2014-10-29 68 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