Мы только начинаем новый проект и смотрим на весеннюю обувь для запуска нашей разработки. Весенняя сапога кажется мощной, но есть какая-то магия, которую мы еще не понимаем.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)
У меня отсутствует что-то очевидное здесь? Или это проблема с весенним сапогом?
Это решает мою первоначальную проблему. Однако при возвращении более сложных доменных объектов с отношениями/коллекциями из ресурса трикотажа возвращается 404.И никакая регистрация не была предоставлена от трикотажа на 404, так что я должен углубиться в это. (Джерси записывает другие вещи, хотя, только не это) – runeaen