0

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);
    }
}
Kevin
  • 7
  • 7

1 Answers1

1

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).

Azquelt
  • 1,380
  • 10
  • 15
  • You are right in saying that the stack trace is much longer I just cut it for brevity but I'll add the whole trace, Liberty certainly is invoking Jackson which makes sense, I'll update my question with my @Post method and hopefully figure out why it is trying to invoke jackson before it "needs" to. – Kevin Nov 22 '16 at 15:06
  • Updated my answer – Kevin Nov 22 '16 at 15:11
  • You were definitely right, switched to just passing an Java Object and was able to reach my code. Do you know of a way I can still pass through my custom object without reaching this error? – Kevin Nov 22 '16 at 15:40
  • Updated my answer. I think you'll need to tell Jackson which fields it should not use for deserializing by annotating them with @JsonIgnore. – Azquelt Nov 22 '16 at 15:42
  • Adding @ JsonIgnore did not do the trick unfortunately. Any other thoughts? I added the annotation to all setters, then to all the getters as well. No such luck. – Kevin Nov 22 '16 at 16:34
  • Based on the Javadoc here: http://fasterxml.github.io/jackson-core/javadoc/1.9/org/codehaus/jackson/annotate/JsonIgnore.html you may need to annotate the fields as well (WAS 8.5.5 uses Jackson 1.6.2 so the behaviour added in 1.9 does not apply). If that doesn't work I'd suggest experimenting with a simpler custom class for your request data and seeing if you can get that to work. – Azquelt Nov 23 '16 at 09:58
  • So I can fix this issue by passing in a generic Object in the rest call and use an ObjectMapper to read the object content into the custom object class, which seems silly. Is there a way to register my POJO such that Jackson can see it? – Kevin Nov 28 '16 at 19:21
  • 1
    I figured it out. You must create a MessageBodyReader class for the POJO which fixed the issue – Kevin Nov 28 '16 at 20:53
  • I agree that does seem silly that it works if you do the serialization manually. I'm surprised you had to create a custom MessageBodyReader, I would have thought that the generic jackson message body reader should cover your usage. In any case, I'm glad you got it working. – Azquelt Nov 29 '16 at 10:04
  • You might want to write a new answer with what you did and mark that as the accepted answer to help anyone else who has the same issue. – Azquelt Nov 29 '16 at 10:04
  • I'm going to continue to investigate further and see if I can find a more suitable method. Hopefully something that doesn't involve creating a whole new class! Thank you for your input! It has been really helpful! – Kevin Nov 29 '16 at 15:23