cxf-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Lukas Rohner (JIRA)" <j...@apache.org>
Subject [jira] [Created] (CXF-7368) JAXB provider is handling non-jaxb classes
Date Thu, 11 May 2017 08:15:04 GMT
Lukas Rohner created CXF-7368:
---------------------------------

             Summary: JAXB provider is handling non-jaxb classes
                 Key: CXF-7368
                 URL: https://issues.apache.org/jira/browse/CXF-7368
             Project: CXF
          Issue Type: Bug
          Components: JAX-RS
    Affects Versions: 3.1.11
            Reporter: Lukas Rohner


The default JSONProvider is trying to marshal a non-jaxb class which results in a 500 response
of my endpoint.

One of my endpoints is returning a StreamingOutput object to the response object:
{noformat}
  public static Response okJson(JValue json) {
    return Response.ok(new StreamingOutput() {
      @Override
      public void write(OutputStream s) throws IOException, WebApplicationException {
        try (final BufferedOutputStream bs = new BufferedOutputStream(s)) {
          serializer.fn.toJson(json).apply(bs);
        }
      }
    }, MediaType.APPLICATION_JSON_TYPE).build();
  }
{noformat}

Unfortunately, the default JSONProvider is trying to marshal this class because it thinks
it is a jaxb supported class. This support check happens in the AbstractJAXBProvider class:
{noformat}
    protected boolean isSupported(Class<?> type, Type genericType, Annotation[] anns)
{
        if (jaxbElementClassMap != null && jaxbElementClassMap.containsKey(type.getName())
            || isSkipJaxbChecks()) {
            return true;
        }
        return isXmlRoot(type)
            || JAXBElement.class.isAssignableFrom(type)
            || objectFactoryOrIndexAvailable(type)
            || (type != genericType && objectFactoryForType(genericType))
            || org.apache.cxf.jaxrs.utils.JAXBUtils.getAdapter(type, anns) != null;
    
    }

    protected boolean objectFactoryOrIndexAvailable(Class<?> type) {
        return type.getResource("ObjectFactory.class") != null
               || type.getResource("jaxb.index") != null; 
    }
{noformat}

The issue is that the objectFactoryOrIndexAvailable is returning true which doesn't indicate
that the type itself is a jaxb class. To fix the support mehtod it should actually check if
there is and jaxb.index file and if in the index file the current type is available. Then
we can clearly say it's a jaxb supported class.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Mime
View raw message