简体   繁体   中英

Jackson MappingException with Websphere Application Server

so I am using WAS 8.5.5.2 and I am getting this error when I make my POST call in postman:

    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

Now I have a CORSFilter setup like this:

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");
    }
}

Which to my understanding is pretty standard. Now this error occurs somewhere between the doFilter , and my rest calls which I have a hard time debugging through since it is all ibm.websphere and cannot really debug through it. Has anyone come across this issue before using Websphere and Jackson and if so how did you fix it? I have seen a few issues about it being either a browser issue, use of JsonCreator or similar but those did not solve my issue. Thanks for your help!

I can provide more code if necessary.

Here is the @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);
    }
}

Firstly, is the stack trace at the top of your question complete? I'd expect to see a bunch more stuff on the end of it (though it's possible it's all masked as [internal classes].

I don't think this problem has anything to do with your CORSFilter, it's more likely a problem with your JAX-RS resource method.

It looks like Websphere is invoking Jackson to turn a JSON response into a Java object. This will happen if the JAX-RS @Post method which you're trying to call takes a Java object which it doesn't know how to read any other way.

It looks like as part of this process, it's trying to create a java.lang.Class object, which isn't allowed and probably isn't what you wanted to do anyway.

Take a look at the @Post method which you expect to invoke with your request and check what it takes as its arguments. I'd expect either that one of the arugments is java.lang.Class , or that it has a field or a getter or setter of type java.lang.Class .

Update based on new information added. I'm guessing that Jackson is trying to eagerly create a deserializer for myCustomObject in preparation for reading the request and and calling your saveFilter method.

To do this, it is trying to create a deserializer for every setter and field in myCustomObject , and then a deserializer for each of their setters and fields, and so on. At some point in this process, it's found a setter or field which is of type java.lang.Class and at this point, it's throwing an error to say it can't deserialize JSON into a Class, because it can't create a new Class instance.

It's likely that you have setters or fields in myCustomObject or in the object it holds which you don't want Jackson to use to deserialize a request. I think you'll need to go through your classes and annotate these fields and setters with org.codehaus.jackson.annotate.JsonIgnore (or annotate the type with org.codehaus.jackson.annotate.JsonIgnoreProperties and list the properties which should be ignored).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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