1

我遇到了一个非常奇怪的问题,我没有找到任何帮助来解决它。我正在使用 Jersey 开发一个应用程序,以提供 GWT 网站访问的 RESTfull 服务。服务生成由 RestyGWT 反序列化的 Json 内容。一切正常,直到我想序列化多态类型。我还使用 Shiro 来保护未经授权的用户返回的值。

序列化过程在使用 Eclipse Indigo 的 Mac OS X Lion 上运行良好,并将 Jetty 作为网络服务器。使用 Tomcat 6 也能很好地工作。当我在 Linux(Ubuntu 12.04 发行版)上时,应用程序使用 Tomcat 6 运行良好,但是当我使用 Ecplise 包含的 Jetty 作为网络服务器时,总是抛出以下异常。

正如我在一些帖子中所读到的,我尝试将每个库更新到最新的稳定版本。有没有人遇到过这个问题?

提前谢谢你。

java.lang.NoSuchFieldError: EXTERNAL_PROPERTY
    at org.codehaus.jackson.map.introspect.JacksonAnnotationIntrospector._findTypeResolver(JacksonAnnotationIntrospector.java:781)
    at org.codehaus.jackson.map.introspect.JacksonAnnotationIntrospector.findTypeResolver(JacksonAnnotationIntrospector.java:199)
    at org.codehaus.jackson.map.AnnotationIntrospector$Pair.findTypeResolver(AnnotationIntrospector.java:1032)
    at org.codehaus.jackson.map.ser.BasicSerializerFactory.createTypeSerializer(BasicSerializerFactory.java:200)
    at org.codehaus.jackson.map.ser.BasicSerializerFactory.buildContainerSerializer(BasicSerializerFactory.java:406)
    at org.codehaus.jackson.map.ser.BeanSerializerFactory.createSerializer(BeanSerializerFactory.java:268)
    at org.codehaus.jackson.map.ser.StdSerializerProvider._createUntypedSerializer(StdSerializerProvider.java:782)
    at org.codehaus.jackson.map.ser.StdSerializerProvider._createAndCacheUntypedSerializer(StdSerializerProvider.java:735)
    at org.codehaus.jackson.map.ser.StdSerializerProvider.findValueSerializer(StdSerializerProvider.java:344)
    at org.codehaus.jackson.map.ser.StdSerializerProvider.findTypedValueSerializer(StdSerializerProvider.java:420)
    at org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:601)
    at org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:256)
    at org.codehaus.jackson.map.ObjectMapper.writeValue(ObjectMapper.java:1613)
    at org.codehaus.jackson.jaxrs.JacksonJsonProvider.writeTo(JacksonJsonProvider.java:558)
    at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:306)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1451)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1363)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1353)
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:414)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:708)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1097)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
    at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
    at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
    at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
    at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:380)
    at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1088)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:324)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:829)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:513)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
4

5 回答 5

1

在我的情况下,同样的异常是由于类路径上有 restygwt 库引起的。

于 2012-06-25T14:37:59.753 回答
1

RestGwt 在它自己的源代码树中包含了 Jackson 注释类。这导致了 Jackson 库和 RestyGwt 之间的版本冲突,从 Jackson 1.9 开始,在 JsonTypeInfo 类中引入了 As Enum 的新枚举值 (EXTERNAL_PROPERTY),它在运行时解决,因此导致上述异常。我的解决方案是回到 Jackson 的 1.7.1 版本。请注意:从我的角度来看,源代码的冗余包含不是解决依赖关系的方法。

于 2013-01-14T08:22:50.453 回答
0

检查您的版本Jackson是 1.9 或更高版本,因为此枚举是在 1.9 中添加的。

于 2012-05-21T12:55:41.483 回答
0

我最近在使用 Jackson 1.9.7 和 RestyGWT 1.3 的 GWT 2.4 应用程序中遇到了同样的问题。

我们正在使用Thomas Broyer 的原型之一,它为 GWT 应用程序生成三个不同的 Maven 项目。我们将 RestyGWT 作为依赖项包含在客户端和共享项目中。因为服务器项目对共享项目有依赖关系,所以我们在服务器项目上对 RestyGWT 有一个依赖关系(以传递方式接收)。因此,为了使其工作,我在设置服务器项目的共享项目依赖项时排除了 RestyGWT 依赖项:

<dependency>
    <groupId>io.pst</groupId>
    <artifactId>accounts-ui-shared</artifactId>
    <exclusions>
       <exclusion>
           <groupId>org.fusesource.restygwt</groupId>
           <artifactId>restygwt</artifactId>
       </exclusion>
    </exclusions>
</dependency>
于 2013-01-18T11:25:44.957 回答
0

一个简单的解决方法是从您的 RestyGWT 依赖项中排除旧的 Jackson 库,同时确保最新的库将取代它:

<dependency>
   <groupId>org.fusesource.restygwt</groupId>
   <artifactId>restygwt</artifactId>
   <version>1.3</version>
   <exclusions>
      <exclusion>
          <groupId>org.codehaus.jackson</groupId>
          <artifactId>*</artifactId>
      </exclusion>
   </exclusions>
</dependency>

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-core-asl</artifactId>
    <version>1.9.9</version>
</dependency>
于 2014-03-19T18:19:35.397 回答