2014-04-12 45 views
1

我一直在開發一個RESTful來理解和學習Jersey,Jackson和Hibernate。 我花了大量的時間來解決這個問題,我認爲一切都很好。但是,當我嘗試下的Apache Tomcat 8上運行的應用程序下引發錯誤:如何在Tomcat下使用Jersey 2.7和Jackson 2.0配置RESTful服務

SEVERE [RMI TCP Connection(3)-127.0.0.1] org.apache.tomcat.util.modeler.BaseModelMBean.invoke Exception invoking method createStandardContext 
javax.management.RuntimeOperationsException: Exception invoking method manageApp 
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:308) 
    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:463) 
    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:413) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    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:1487) 
    at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:97) 
    at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1328) 
    at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1420) 
    at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:848) 
[2014-04-11 10:32:26,913] Artifact company-app:war exploded: Error during artifact deployment. See server log for details. 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322) 
    at sun.rmi.transport.Transport$1.run(Transport.java:177) 
    at sun.rmi.transport.Transport$1.run(Transport.java:174) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:556) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:811) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:670) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:744) 
Caused by: java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/company-app]] 
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:729) 
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:702) 
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:697) 
    at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1646) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) 
    ... 31 more 

這是web.xml下2.5版本:

<?xml version="1.0" encoding="UTF-8"?> 
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns="http://java.sun.com/xml/ns/javaee" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
      version="2.5"> 
     <display-name>company-app</display-name> 
     <!-- Jersey servlet Configuration --> 
     <servlet> 
      <servlet-name>app-servlet</servlet-name> 
      <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
      <init-param> 
       <param-name>org.glassfish.jersey.config.provider.packages</param-name> 
       <param-value>com.company.resources</param-value> 
      </init-param> 
      <init-param> 
       <param-name>javax.ws.rs.Application</param-name> 
       <param-value>com.company.configuration.RestApp</param-value> 
      </init-param> 
      <load-on-startup>1</load-on-startup> 
     </servlet> 
     <servlet-mapping> 
      <servlet-name>app-servlet</servlet-name> 
      <url-pattern>/service/*</url-pattern> 
     </servlet-mapping> 
     <welcome-file-list> 
      <welcome-file>hotel-application.html</welcome-file> 
     </welcome-file-list> 
     <!-- Jersey servlet Configuration --> 

    </web-app> 

這是實現JacksonFeature的啓用JSON轉換:

package com.company.features; 

    import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; 
    import com.fasterxml.jackson.jaxrs.base.JsonMappingExceptionMapper; 
    import com.fasterxml.jackson.jaxrs.base.JsonParseExceptionMapper; 
    import org.glassfish.jersey.CommonProperties; 

    import javax.ws.rs.core.Feature; 
    import javax.ws.rs.core.FeatureContext; 
    import javax.ws.rs.ext.MessageBodyReader; 
    import javax.ws.rs.ext.MessageBodyWriter; 


    public class JacksonFeature implements Feature { 

     public boolean configure(final FeatureContext context) { 

      String postfix = '.' + context.getConfiguration().getRuntimeType().name().toLowerCase(); 

      context.property(CommonProperties.MOXY_JSON_FEATURE_DISABLE + postfix, true); 

      context.register(JsonParseExceptionMapper.class); 
      context.register(JsonMappingExceptionMapper.class); 
      context.register(JacksonJsonProvider.class, MessageBodyReader.class, MessageBodyWriter.class); 

      return true; 
     } 

    } 

這是實現RestApp類:

package com.company.configuration; 

    import com.company.features.JacksonFeature; 
    import org.glassfish.jersey.message.GZipEncoder; 
    import org.glassfish.jersey.server.ResourceConfig; 

    //@javax.ws.rs.ApplicationPath("/service/*") 
    public class RestApp extends ResourceConfig { 
     public RestApp() { 
      register(new GZipEncoder()); 
      register(JacksonFeature.class); 
      //packages("com.company.resources"); 
     } 
    } 

而這些都是正在使用的應用程序在pom.xml的依賴關係:

 <dependency> 
      <groupId>javax.ws.rs</groupId> 
      <artifactId>javax.ws.rs-api</artifactId> 
      <version>2.0</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.jersey.containers</groupId> 
      <artifactId>jersey-container-servlet-core</artifactId> 
      <version>2.7</version> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.jersey.containers</groupId> 
      <artifactId>jersey-container-jdk-http</artifactId> 
      <version>2.7</version> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.jersey.media</groupId> 
      <artifactId>jersey-media-json-jackson</artifactId> 
      <version>2.7</version> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-annotations</artifactId> 
      <version>2.0.0</version> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-core</artifactId> 
      <version>2.0.0</version> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-databind</artifactId> 
      <version>2.0.0</version> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.jaxrs</groupId> 
      <artifactId>jackson-jaxrs-json-provider</artifactId> 
      <version>2.2.3</version> 
     </dependency> 

對這個問題有什麼想法?

回答

0

我和你有同樣的問題,但我剛纔解決了它。

  1. 下載Jersey JAX-RS 2.0 bundle,並解壓縮
  2. 複製所有文件lib/api/下你WEB-INF/lib
  3. 和最重要的!複製所有文件ext/下你的tomcat的lib/文件夾(即/opt/apache-tomcat/lib在我的Ubuntu)

this question

相關問題