Idea+Maven+Jersey2+Tomcat配置Web服务

Idea+Maven+Jersey2+Tomcat配置Web服务

关于在Idea中使用Maven来管理配置Jersey2服务的文章有很多,本文主要总结自己踩过的一些坑,希望对大家有所帮助。


基本环境配置

  1. 可以参考博客:
    https://www.cnblogs.com/huaxingtianxia/p/5581259.html。
    https://www.cnblogs.com/MarsCheng/p/7245292.html。
  2. 需要注意的是包的导入,缺失一些包会导致服务无法正常运行。主要的包包括:
    服务器:jersey-server.jar 、jersey-container-servlet-core.jar、jersey-container-servlet.jar、javax.ws.rs-api-2.0.jar
    客户端:jersey-client.jar
    common:jersey-common.jar
    hk2:jersey-hk2.jar
    json支持:在Jersey2.0中需要使用 Jackson1.9 才能支持json。
  3. web.xml文件中配置jersey2中的继承ResourceConfig子类的servlet。在url-pattern中设置/*即可,不用加上工程名称。因为项目在部署到tomcat服务器上时,默认是加上项目名进行访问的。(当时这个地方搞了好久)

    <servlet>
       <servlet-name>JerseyServletservlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainerservlet-class>
        <init-param>
            <param-name>javax.ws.rs.Applicationparam-name>
            <param-value>app.MyRregisterparam-value>
        init-param>
    
        <load-on-startup>1load-on-startup>
    servlet>
    <servlet-mapping>
        <servlet-name>JerseyServletservlet-name>
        <url-pattern>/*url-pattern>
    servlet-mapping>
  4. Idea配置运行的tomcat服务器:端口和将要发布到的tomcat端口保持一致,否则无法访问。(另外一个坑)
    Idea+Maven+Jersey2+Tomcat配置Web服务_第1张图片

  5. Idea配置运行的tomcat服务器:Deployment中war exploded中的Application context加上 “/+项目名称”,这样可以你平常在idea运行tomcat测试的API和你将来发布到tomcat的api保持一致。(后来发现不设置好像加上项目名也可以访问,建议加上,养成良好的习惯)
    Idea+Maven+Jersey2+Tomcat配置Web服务_第2张图片

  6. 在Idea启动tomcat服务时,遇到类似如下问题时候:

    org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:752)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
        at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1739)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
        at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
        at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:482)
        at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:431)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
        at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
        at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)
        at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
        at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
        at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401)
        at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)
        at sun.rmi.transport.Transport$1.run(Transport.java:200)
        at sun.rmi.transport.Transport$1.run(Transport.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
    Caused by: java.lang.NoClassDefFoundError: javax/ws/rs/ProcessingException

    一般由于jersey包没有导导入完全,但是我发现maven里面都添加了。其实“project setting”->“Artifacts”->“* exploded”->“WEB-INF”->“lib”中发现没有把“javax.ws.rs-api:2.1”这个包加到tomcat的运行环境中,导入启动tomcat的过程出错,因此需要手动点击添加,随后即可正常启动tomcat服务器。(这个很坑爹,希望有大神可以更好的解决)
    Idea+Maven+Jersey2+Tomcat配置Web服务_第3张图片

    eclipse里面如果报这个错误可以直接把“javax.ws.rs-api:2.1”这个包从pom报中删除即可正常导入。


总结

最近配了两天这个问题,发现还是自己需要多看看原理,这样才能更好地配置环境之类的。

你可能感兴趣的:(java,jersey)