繁体   English   中英

Websphere Application Server的Jackson映射异常

[英]Jackson MappingException with Websphere Application Server

所以我使用的是WAS 8.5.5.2,在邮递员中进行POST呼叫时出现此错误:

    javax.servlet.ServletException: org.codehaus.jackson.map.JsonMappingException:
     Can not access private java.lang.Class() (from class java.lang.Class; failed to set access: Can not make a java.lang.Class constructor accessible
    at org.apache.wink.server.internal.RequestProcessor.handleRequest(RequestProcessor.java:195)
    at com.ibm.websphere.jaxrs.server.IBMRestServlet.service(IBMRestServlet.java:106)
    at [internal classes]
    at com.myproject.web.CORSFilter.doFilter(CORSFilter.java:50)
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:194)
    at [internal classes]
    Caused by: org.codehaus.jackson.map.JsonMappingException: Can not access private java.lang.Class() (from class java.lang.Class; failed to set access: Can not make a java.lang.Class constructor accessible
    at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCache2(StdDeserializerProvider.java:269)
    at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCacheValueDeserializer(StdDeserializerProvider.java:244)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCacheValueDeserializer(StdDeserializerProvider.java:244)
at org.codehaus.jackson.map.deser.StdDeserializerProvider.findValueDeserializer(StdDeserializerProvider.java:111)
at org.codehaus.jackson.map.deser.StdDeserializer.findDeserializer(StdDeserializer.java:483)
at org.codehaus.jackson.map.deser.BeanDeserializer.resolve(BeanDeserializer.java:271)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._resolveDeserializer(StdDeserializerProvider.java:348)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCache2(StdDeserializerProvider.java:303)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCacheValueDeserializer(StdDeserializerProvider.java:244)
at org.codehaus.jackson.map.deser.StdDeserializerProvider.findValueDeserializer(StdDeserializerProvider.java:111)
at org.codehaus.jackson.map.deser.BasicDeserializerFactory.createCollectionDeserializer(BasicDeserializerFactory.java:183)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._createDeserializer(StdDeserializerProvider.java:332)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCache2(StdDeserializerProvider.java:264)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCacheValueDeserializer(StdDeserializerProvider.java:244)
at org.codehaus.jackson.map.deser.StdDeserializerProvider.findValueDeserializer(StdDeserializerProvider.java:111)
at org.codehaus.jackson.map.deser.StdDeserializer.findDeserializer(StdDeserializer.java:483)
at org.codehaus.jackson.map.deser.BeanDeserializer.resolve(BeanDeserializer.java:271)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._resolveDeserializer(StdDeserializerProvider.java:348)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCache2(StdDeserializerProvider.java:303)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCacheValueDeserializer(StdDeserializerProvider.java:244)
at org.codehaus.jackson.map.deser.StdDeserializerProvider.findValueDeserializer(StdDeserializerProvider.java:111)
at org.codehaus.jackson.map.deser.StdDeserializerProvider.findTypedValueDeserializer(StdDeserializerProvider.java:127)
at org.codehaus.jackson.map.ObjectMapper._findRootDeserializer(ObjectMapper.java:2046)
at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:1961)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:889)
at org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:410)
at org.apache.wink.providers.jackson.WinkJacksonJaxbJsonProvider.readFrom(WinkJacksonJaxbJsonProvider.java:106)
at org.apache.wink.server.internal.registry.ServerInjectableFactory$EntityParam.getValue(ServerInjectableFactory.java:198)
at org.apache.wink.common.internal.registry.InjectableFactory.instantiate(InjectableFactory.java:68)
at org.apache.wink.server.internal.handlers.CreateInvocationParametersHandler.handleRequest(CreateInvocationParametersHandler.java:44)
at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)
at org.apache.wink.server.handlers.AbstractHandler.handleRequest(AbstractHandler.java:34)
at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)
at org.apache.wink.server.internal.handlers.FindResourceMethodHandler.handleSubResourceMethod(FindResourceMethodHandler.java:188)
at org.apache.wink.server.internal.handlers.FindResourceMethodHandler.handleRequest(FindResourceMethodHandler.java:110)
at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)
at org.apache.wink.server.internal.handlers.FindRootResourceHandler.handleRequest(FindRootResourceHandler.java:95)
at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)
at org.apache.wink.server.internal.handlers.HeadMethodHandler.handleRequest(HeadMethodHandler.java:53)
at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)
at org.apache.wink.server.internal.handlers.OptionsMethodWADLHandler.handleRequest(OptionsMethodWADLHandler.java:51)
at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)
at org.apache.wink.server.internal.handlers.SearchResultHandler.handleRequest(SearchResultHandler.java:33)
at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)
at org.apache.wink.server.internal.log.ResourceInvocation.handleRequest(ResourceInvocation.java:92)
at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)
at org.apache.wink.server.internal.log.Requests.handleRequest(Requests.java:76)
at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)
at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)
at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)
at org.apache.wink.server.handlers.AbstractHandlersChain.run(AbstractHandlersChain.java:60)
at org.apache.wink.server.internal.RequestProcessor.handleRequestWithoutFaultBarrier(RequestProcessor.java:207)
at org.apache.wink.server.internal.RequestProcessor.handleRequest(RequestProcessor.java:154)
... 5 more
Caused by: java.lang.IllegalArgumentException: Can not access private java.lang.Class() (from class java.lang.Class; failed to set access: Can not make a java.lang.Class constructor accessible
at org.codehaus.jackson.map.util.ClassUtil.checkAndFixAccess(ClassUtil.java:371)
at org.codehaus.jackson.map.deser.BeanDeserializerFactory.addDeserializerCreators(BeanDeserializerFactory.java:240)
at org.codehaus.jackson.map.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:141)
at org.codehaus.jackson.map.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:116)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._createDeserializer(StdDeserializerProvider.java:342)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCache2(StdDeserializerProvider.java:264)
... 72 more

现在,我有一个像这样的CORSFilter设置:

public class CORSFilter implements Filter {
    public static final Logger LOG = LoggerFactory.getLogger(CORSFilter.class);
    public static final String ACA_ORIGIN = "Access-Control-Allow-Origin";
    public static final String ACA_HEADERS = "Access-Control-Allow-Headers";
    public static final String ACA_METHODS = "Access-Control-Allow-Methods";
    public static final String ACA_WILDCARD = "*";
    public static final String ACA_HEADERS_VALUES = "Origin, Accept, X-Requested-With, X-Auth-Token, Content-Type";
    public static final String ACA_METHODS_VERBS = "POST, GET, OPTIONS, PUT, DELETE, HEAD";

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        LOG.info("Initialized");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        final HttpServletResponse httpResponse = (HttpServletResponse)servletResponse;
        final HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
        if (servletResponse instanceof HttpServletResponse)
        {
            httpResponse.addHeader(ACA_ORIGIN, ACA_WILDCARD);
            httpResponse.addHeader(ACA_HEADERS, ACA_HEADERS_VALUES);
            httpResponse.addHeader(ACA_METHODS, ACA_METHODS_VERBS);
            LOG.debug("Request: {}", servletRequest.getLocalName());
            LOG.debug("Response: {}", ((HttpServletResponse) servletResponse).getStatus());
            LOG.debug("Response Headers: {}", ((HttpServletResponse) servletResponse).getHeaderNames());
            // Just ACCEPT and REPLY OK if OPTIONS
            if ( httpRequest.getMethod().equals("OPTIONS") ) {
                httpResponse.setStatus(HttpServletResponse.SC_OK);
                return;
            }
            LOG.debug("Request: {}", httpRequest.getMethod());
        }  
        filterChain.doFilter(httpRequest, httpResponse);

    }

    @Override
    public void destroy() {
        LOG.info("Destroyed");
    }
}

据我了解,这是相当标准的。 现在,此错误发生在doFilter and my rest calls之间的某个地方, and my rest calls很难调试通过它,因为它全部是ibm.websphere ,并且无法真正通过它进行调试。 在使用Websphere和Jackson之前,是否有人遇到过此问题?如果是,您如何解决它? 我已经看到了一些有关浏览器问题,使用JsonCreator或类似问题的问题,但是这些问题并没有解决我的问题。 谢谢你的帮助!

如果需要,我可以提供更多代码。

这是@Post

 @POST
@Path("/save")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public boolean saveFilter(final myCustomObject myObject){
    try
    {

        return dataManager.saveMyObject(myObject);
    }
    catch (Exception x)
    {
        throw new WebApplicationException("Cannot save filter",
                                          Status.INTERNAL_SERVER_ERROR);
    }
}

首先,问题顶部的堆栈跟踪是否完整? 我希望在它的末尾看到更多的东西(尽管有可能将它们全部掩盖为[内部类]。

我认为此问题与您的CORSFilter没有任何关系,它很可能与您的JAX-RS资源方法有关。

看起来Websphere正在调用Jackson来将JSON响应转换为Java对象。 如果您尝试调用的JAX-RS @Post方法采用了一个Java对象,而该Java对象不知道如何读取其他方法,则会发生这种情况。

看起来,作为此过程的一部分,它试图创建一个java.lang.Class对象,该对象是不允许的,而且可能不是您想要执行的操作。

看一下您希望在请求中调用的@Post方法,并检查将其作为参数的方式。 我希望其中之一是java.lang.Class ,或者它具有java.lang.Class类型的字段或getter或setter。

根据添加的新信息进行更新 我猜杰克逊(Jackson)试图为myCustomObject创建一个反序列化器,以准备读取请求并调用saveFilter方法。

为此,它尝试为myCustomObject每个设置器和字段创建一个反序列化器,然后为它们的每个设置器和字段创建一个反序列化器,依此类推。 在此过程中的某个时刻,它找到了一个类型为java.lang.Class的setter或字段,这时抛出了一个错误,即它无法将JSON反序列化为Class,因为它无法创建一个新的Class实例。

您可能不想让Jackson用来反序列化请求的myCustomObject或其所保存的对象中有setter或字段。 我想你会需要通过类和标注这些领域和setter方法与org.codehaus.jackson.annotate.JsonIgnore (或注释与类型org.codehaus.jackson.annotate.JsonIgnoreProperties并列出哪些应该被忽略的属性)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM