Java 在jetty应用程序中使用resteasy jackson提供程序时缺少FindAnnotation类
我试图在Jetty应用程序中使用RestEasy。我正在使用Jackson对我的POJO进行序列化/反序列化。我需要我的序列化是多态的,因为我有处理具有子类型的POJO类型的端点。我想我可以使用Java 在jetty应用程序中使用resteasy jackson提供程序时缺少FindAnnotation类,java,jackson,jetty,resteasy,fasterxml,Java,Jackson,Jetty,Resteasy,Fasterxml,我试图在Jetty应用程序中使用RestEasy。我正在使用Jackson对我的POJO进行序列化/反序列化。我需要我的序列化是多态的,因为我有处理具有子类型的POJO类型的端点。我想我可以使用resteasy jackson provider来提供MessageBodyWriter和MessageBodyReader实现 调用终结点时,会出现以下错误: java.lang.NoClassDefFoundError: org/jboss/resteasy/util/FindAnnotation
resteasy jackson provider
来提供MessageBodyWriter和MessageBodyReader实现
调用终结点时,会出现以下错误:
java.lang.NoClassDefFoundError: org/jboss/resteasy/util/FindAnnotation
at org.jboss.resteasy.plugins.providers.jackson.ResteasyJacksonProvider.isWriteable(ResteasyJacksonProvider.java:42)
at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.resolveMessageBodyWriter(ResteasyProviderFactoryImpl.java:1322)
at org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.getMessageBodyWriter(ResteasyProviderFactoryImpl.java:1293)
at org.jboss.resteasy.core.ServerResponseWriter.lambda$writeNomapResponse$2(ServerResponseWriter.java:112)
at org.jboss.resteasy.core.interception.jaxrs.ContainerResponseContextImpl.filter(ContainerResponseContextImpl.java:405)
at org.jboss.resteasy.core.ServerResponseWriter.executeFilters(ServerResponseWriter.java:232)
at org.jboss.resteasy.core.ServerResponseWriter.writeNomapResponse(ServerResponseWriter.java:97)
at org.jboss.resteasy.core.ServerResponseWriter.writeNomapResponse(ServerResponseWriter.java:70)
at org.jboss.resteasy.core.SynchronousDispatcher.writeResponse(SynchronousDispatcher.java:578)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:508)
at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:252)
at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:153)
at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:363)
at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:156)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:238)
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:249)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:60)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:841)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:535)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:188)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1253)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:168)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:166)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1155)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.Server.handle(Server.java:561)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:334)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:104)
at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:247)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:140)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:679)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:597)
at java.base/java.lang.Thread.run(Thread.java:834)
这是我的POM文件:
4.0.0
com.foster.app
jettyRestEasyApiService
3.0.0
罐子
Jetty RESTEasy Api服务
UTF-8
1.8
1.8
9.4.7.v20170914
org.eclipse.jetty
码头servlet
${version.jetty}
com.fasterxml.jackson.core
杰克逊数据绑定
2.9.9
com.fasterxml.jackson.core
杰克逊注释
2.9.9
org.jboss.resteasy
resteasy堆芯
4.2.0.4最终版本
罐子
org.jboss.resteasy
resteasy jackson提供商
3.9.0.1最终版本
JettyRestEasyApiService
org.apache.maven.plugins
maven编译器插件
3.8.1
${maven.compiler.source}
${maven.compiler.target}
maven surefire插件
2.19
真的
org.apache.maven.plugins
maven汇编插件
3.1.1
包裹
单一的
com.foster.app.resteasy.rest.app
带有依赖项的jar
这是我的主要课程:
import java.util.logging.Level;
import java.util.logging.Logger;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher;
public class App {
private static final Logger LOGGER = Logger.getLogger(App.class.getName());
private static final String APPLICATION_PATH = "/jetty/resteasy";
private static final String CONTEXT_ROOT = "/";
private static final Server JETTY_SERVER = new Server(8080);
public App() {}
public static void main(String[] args) throws Exception {
try {
new App().run();
} catch (Exception ex) {
LOGGER.log(Level.SEVERE, "Application Exception", ex);
throw ex;
} finally {
if (JETTY_SERVER != null) {
JETTY_SERVER.destroy();
}
}
}
public void run() throws Exception {
final ServletContextHandler context = new ServletContextHandler(JETTY_SERVER, CONTEXT_ROOT);
final ServletHolder restEasyServlet = new ServletHolder(new HttpServletDispatcher());
restEasyServlet.setInitParameter("resteasy.servlet.mapping.prefix", APPLICATION_PATH);
restEasyServlet.setInitParameter("javax.ws.rs.Application", JaxRsActivator.class.getCanonicalName());
context.addServlet(restEasyServlet, APPLICATION_PATH + "/*");
final ServletHolder defaultServlet = new ServletHolder(new DefaultServlet());
context.addServlet(defaultServlet, CONTEXT_ROOT);
JETTY_SERVER.start();
LOGGER.log(Level.INFO, "Started Server");
JETTY_SERVER.join();
LOGGER.log(Level.INFO, "Joined Server");
}
}
这是我的应用程序类:
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
public class JaxRsActivator extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new HashSet<>();
resources.add(MessageResource.class);
resources.add(TestResource.class);
return resources;
}
}
这是我的终点:
@Path("/test")
public class TestResource {
@GET
@Path("pojo")
@Produces(MediaType.APPLICATION_JSON)
public Response getPojo() {
Pojo pojo = new PojoDog();
pojo.property1 = "Hello";
pojo.property2 = "World";
pojo.property3 = 5;
pojo.property4 = new Date();
((PojoDog)pojo).clifford = "I am a dog.";
return Response.ok(pojo).build();
}
}
类
org.jboss.resteasy.util.FindAnnotation
是resteasy jaxrs
工件的一部分
请参阅搜索:
这让我看到,您已经混合了resteasy版本
org.jboss.resteasy
升级到
完全从pom中删除了两个Jackson依赖项,依赖于它们来自对resteasy-jackson2-provider的传递依赖项
我初始化的ServletContextHandler
略有不同(不要将服务器传递给构造函数,因为这是处理程序树的工作)
final ServletContextHandler context=new ServletContextHandler();
final ServletHolder restEasyServlet=新的ServletHolder(新的HttpServletDispatcher());
setContextPath(context_ROOT);
restEasyServlet.setInitParameter(“resteasy.servlet.mapping.prefix”,应用程序路径);
setInitParameter(“javax.ws.rs.Application”,jaxractivator.class.getCanonicalName());
addServlet(restEasyServlet,应用程序路径+“/*”);
final ServletHolder defaultServlet=新的ServletHolder(“default”,defaultServlet.class);//此处的“默认”名称很重要
addServlet(defaultServlet,“/”);//这不是上下文根,而是默认的url模式
HandlerList handlers=new HandlerList();
addHandler(上下文);
handlers.addHandler(新的DefaultHandler());//更好地报告与根上下文不匹配的错误
JETTY_SERVER.setHandler(处理程序);
JETTY_SERVER.start();
@Path("/test")
public class TestResource {
@GET
@Path("pojo")
@Produces(MediaType.APPLICATION_JSON)
public Response getPojo() {
Pojo pojo = new PojoDog();
pojo.property1 = "Hello";
pojo.property2 = "World";
pojo.property3 = 5;
pojo.property4 = new Date();
((PojoDog)pojo).clifford = "I am a dog.";
return Response.ok(pojo).build();
}
}