2016-11-22 1 views
0

поэтому я использую БЫЛ 8.5.5.2, и я получаю эту ошибку, когда я делаю мой POST вызов в почтальона:Джексон MappingException с WebSphere Application Server

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, с которой мне трудно отлаживать, поскольку все это 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); 
    } 
} 

ответ

1

Во-первых, это трассировки стека в верхней части вашего вопроса полной? Я ожидаю увидеть кучу больше материала на конце (хотя возможно, что все это маскировано как [внутренние классы].

Я не думаю, что эта проблема имеет какое-либо отношение к вашему CORSFilter, это скорее проблема с вашим ресурсным методом JAX-RS.

Похоже, что Websphere вызывает Джексона, чтобы включить ответ JSON в объект Java. Это произойдет, если метод JAX-RS @Post, который вы пытаетесь вызвать, принимает Java-объект, который он не знает, как читать другим способом.

Похоже, что в рамках этого процесса он пытается создать объект java.lang.Class, который недопустим и, вероятно, не является что вы хотели сделать в любом случае.

Посмотрите на метод @Post, который вы ожидаете вызвать с запросом, и проверьте, что он принимает в качестве своих аргументов. Я ожидал бы, что одна из презервативов равна java.lang.Class или что у нее есть поле или геттер или сеттер типа java.lang.Class.

Обновление на основе новой информации добавлено. Я предполагаю, что Джексон пытается с нетерпением создать десериализатор для myCustomObject в рамках подготовки к чтению запроса и вызова вашего метода saveFilter.

Чтобы сделать это, он пытается создать десериализатор для каждого сеттера и поля в myCustomObject, а затем десериализатор для каждого из своих сеттеров и полей и т. Д. В какой-то момент этого процесса обнаруживается сеттер или поле, которое имеет тип java.lang.Class, и в этот момент он бросает ошибку, заявив, что не может десериализовать JSON в класс, потому что он не может создать новый экземпляр класса.

Возможно, у вас есть сеттеры или поля в myCustomObject или в объекте, который он держит, который вы не хотите использовать Джексон для десериализации запроса. Я думаю, вам нужно пройти через свои классы и аннотировать эти поля и сеттеры с помощью org.codehaus.jackson.annotate.JsonIgnore (или аннотировать тип с помощью org.codehaus.jackson.annotate.JsonIgnoreProperties и перечислить свойства, которые следует игнорировать).

+0

Вы правы, говоря, что трассировка стека намного длиннее. Я просто сократил ее для краткости, но я добавлю весь след, Свобода, безусловно, вызывает Джексона, что имеет смысл, я обновлю свой вопрос с помощью @Post метод и, надеюсь, выяснить, почему он пытается вызвать джексон, прежде чем он «нуждается». – Kevin

+0

Обновлен мой ответ – Kevin

+0

Вы определенно были правы, переключились на передачу Java-объекта и смогли достичь моего кода. Знаете ли вы, каким образом я могу пройти через свой пользовательский объект, не достигнув этой ошибки? – Kevin

Смежные вопросы