Java 在jetty应用程序中使用resteasy jackson提供程序时缺少FindAnnotation类

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

我试图在Jetty应用程序中使用RestEasy。我正在使用Jackson对我的POJO进行序列化/反序列化。我需要我的序列化是多态的,因为我有处理具有子类型的POJO类型的端点。我想我可以使用
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();
        }
    }