2014-10-29 7 views
0

Мы только начинаем новый проект и смотрим на весеннюю обувь для запуска нашей разработки. Весенняя сапога кажется мощной, но есть какая-то магия, которую мы еще не понимаем.spring-boot-jersey не автообнаружен jersey-media-moxy

Я клонировал образцы весенних ботинок и провел пример Джерси. 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 сервер, а ресурс EndPoint в образцах работают.

Нет, я хочу, чтобы сериализации моего объекта домена в формат 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() 
      } 
     } 
    } 


} 

При работе в качестве примера, я использую локон, чтобы создать новый человек. Смотрите последний метод -> addPerson

При обращении к к «поздороваться» ресурс, это прекрасно работает, возвращая строку

Однако при попытке вернуть JSon represenation человек, используя метод «getPerson», это не удается с

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 Docs

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

Это должно быть Auto-Видимый функция, так что это должно работать, не требуя регистрирующего 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 использует версию 2.7 других модулей Джерси. Возврат к 2.7 модуля jersey-media-moxy должен устранить проблему. В качестве альтернативы, последние снимки Boots 1.2.0 теперь используют Jersey 2.13, чтобы вы могли обновить свою зависимость от загрузки до 1.2.0.BUILD-SNAPSHOT.

+0

Это решает мою первоначальную проблему. Однако при возвращении более сложных доменных объектов с отношениями/коллекциями из ресурса трикотажа возвращается 404.И никакая регистрация не была предоставлена ​​от трикотажа на 404, так что я должен углубиться в это. (Джерси записывает другие вещи, хотя, только не это) – runeaen

Смежные вопросы