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.