Verificar a classe de inicialização de factory de contexto JAXB

Esta regra está relacionada a mudanças na classe de inicialização do Java Architecture for XML Binding (JAXB) e conflitos que podem ocorrer ao migrar de versões do WebSphere Application Server anteriores a V7.0. Existem dois cenários de migração JAXB que causaram problemas com os aplicativos do cliente. O primeiro está relacionado aos aplicativos migrados do WebSphere 6.1 Feature Pack para Serviços da Web. O segundo cenário está relacionado aos aplicativos clientes que compactam uma implementação JAXB e estão migrados ao WebSphere V7.0 ou mais recentes.

No WebSphere V7.0, o JAXB 2.1 é enviado como parte do tempo de execução Java 6. Antes de V7.0, o WebSphere 6.1 Feature Pack para Serviços da Web enviava JAXB 2.0 que usava uma classe de inicialização diferente da usada no JAXB 2.1 ou 2.2 (V8.0). Se o aplicativo especificar o uso de uma classe de inicialização antiga, exceções de classe não localizada podem ser geradas quando o aplicativo for executado. A classe de inicialização pode ser definida usando a propriedade javax.xml.bind.context.factory. A antiga classe de inicialização é com.sun.xml.bind.ContextFactory. Se o nome de classe antigo estiver definido na propriedade javax.xml.bind.context.factory, você obterá uma java.lang.ClassNotFoundException ao usar as bibliotecas JAXB disponíveis com o Java 6.

Esta regra procura o método javax.xml.bind.JAXBContext.newInstance que é usado para obter um JAXBContext. Se você estiver usando JAXB, deve verificar seu aplicativo para uso do factory de contexto antigo. A regra também detectará os literais de sequência de caracteres "com.sun.xml.bind.ContextFactory" ou "com.sun.xml.bind.DefaultJAXBContextImpl" no código Java, mas não verifica os arquivos de propriedade onde esses valores são muitas vezes configurados. Eles também podem ser configurados nas propriedades de sistema Java.

As propriedades JAXB geralmente são carregadas a partir de um arquivo jaxb.properties. Varra manualmente seus arquivos de propriedade de aplicativo para determinar se o antigo factory de contexto está definido.

Para varrer os arquivos de propriedades no Eclipse, selecione Procurar > Arquivo.... No campo Contendo o texto, digite com.sun.xml.bind.ContextFactory. No campo Padrões de Nome do Arquivo, digite *.properties. Repita a procura para a sequência com.sun.xml.bind.DefaultJAXBContextImpl.

Ao usar JAXB no WebSphere V7 ou V8, a classe de inicialização padrão será com.ibm.xml.xlxp2.jaxb.JAXBContextFactory se nenhuma propriedade javax.xml.bind.context.factory estiver configurada.

Para o segundo cenário, os clientes que compactaram uma implementação JAXB como parte de seus aplicativos antes de V7 também podem apresentar os problemas recém-descritos ou mudanças de comportamento ao migrar para o WebSphere V7.0 ou mais recente. Isso ocorre quando o JAXB versões 2.1 ou 2.2 fornecido como parte do tempo de execução Java for carregado em vez da implementação JAXB enviada com o aplicativo. O artigo Ativando um aplicativo JAX-WS de terceiros no WebSphere Application Server V7 descreve como trabalhar uma solução alternativa para problemas no carregador de classes se você desejar continuar usando a sua implementação JAXB.

Para obter informações adicionais, consulte as referências a seguir