setProperty must be overridden by all subclasses of SOAPMessage

May 8th, 2008 by rafaelliu Leave a reply »

Tive recentemente que fazer uma prova de conceito, usando web services. Criei uma aplicação usando JAX-WS no JBoss 4.2.2 rodando na JDK 6 da Sun e me deparei um a seguinte exceção:

java.lang.UnsupportedOperationException: setProperty must be overridden by all subclasses of SOAPMessage
at javax.xml.soap.SOAPMessage.setProperty(SOAPMessage.java:424)
at org.jboss.ws.core.soap.SOAPMessageImpl.<init>(SOAPMessageImpl.java:83)
at org.jboss.ws.core.soap.MessageFactoryImpl.createMessage(MessageFactoryImpl.java:161)

Pesquisando um pouco achei vários relatos similares e até uma entrada no JIRA. A classe SOAPMessage é da biblioteca SAAJ, e o problema é entre o JBoss e a JDK 6. Até a versão 6, essa biblioteca era distruida separadamente, mas na nova versão ela já vem integrada. O problema é que o JBoss já possui uma implementação própria dessa biblioteca e ao se carregar o SOAPMessage a biblioteca da Sun é utilizada, a qual está implementada de forma lançar um UnsupportedOperationException.

Uma solução é usar o esquema de endorsed da JVM. Bibliotecas endorsed são carregadas antes, tendo prioridade então sobre quaisquer outras bibliotecas. Assim, basta adicionarmos o jboss-saaj.jar (em <CONFIG_HOME>/lib) ao <JBOSS_HOME>/lib/endorsed. O script run.sh define a variável JBOSS_ENDORSED_DIRS=”$JBOSS_HOME/lib/endorsed” e cuida de setar esse diretório na propriedade java.endorsed.dirs da JVM.

Mas eu estou rodando o JBoss para JDK 6! (EDIT)

Existe uma “peculiaridade” se você estiver rodando o JBoss 5 para JDK 6 no WTP do Eclipse. O JBoss 5 usa o $JBOSS_HOME/lib/endorsed como o java.endorsed.dirs, setando esse parâmetro quando executamos o $JBOSS_HOME/bin/run.sh. O problema quando executamos via WTP é que o eclipse não usar o run.sh, portanto não seta o diretório endorsed e caímos no mesmo problema do JBoss 4.

Para resolver o problema basta clicar no “launch configuration” do servidor e adicionar o seguinte parâmetro no “VM arguments”:

-Djava.endorsed.dirs=../lib/endorsed

IMPORTANTE: O JBoss não é oficialmente suportado na JDK 6 e outros imprevistos podem vir a ocorrer. Recomenda-se utilizar a JDK 5, ao invés.

Advertisement

19 comments

  1. Sidney says:

    Obrigado pelo post! Me economizou algumas horas de pesquisa :-)

  2. André says:

    Minha tambem….o motivo não era o mesmo mas já deu para dar uma luz!

    Obrigado!

  3. Natanael says:

    Muito obrigado pelo post ! me economizou tb um baita dor de cabeça

    WebServices Rules !!!

  4. Diego Santiviago says:

    Boa! Valeu! :)

  5. Valeu, Liu!!! Tive o mesmo problema agora e consegui solucionar através desta sua postagem.

    []‘s

  6. Francisco Moura says:

    Rafael,
    usando o JBossWS-Native 3.2.2 esse problema não ocorre. Basta seguir a documentação do JBossWS-Native e executar a instalação usando o ant.
    Testei com jboss 5.1 compilado para jdk 5 e jdk 6.

    Saudações!

    • rafaelliu says:

      Francisco,
      com o JBoss 5.1 não há esse problema, ele já utiliza uma pasta endorsed por padrão ($JBOSS_HOME/lib/endorsed).

  7. Danilo Oliveira says:

    Tenho uma solução bem mais imples. Sem mexer no JBoss. No meu caso o Servidor é controlado por outra equipe e por isso não posso mexer nas libs do JBoss. Coloquei a “saaj-impl.jar” dentro do projeto. Funcionou perfeitamente.

    • rafaelliu says:

      Danilo,
      você deve estar usando a versão correta do JBoss, com a JDK correspondente. O post é para quem tem que usar versões diferentes.

  8. Tuelho says:

    Grande Liu!

    Valeu pela dica!

  9. carutcho says:

    Salvou a minha vida cara,
    Mt bom post…

    Absss

  10. Jonas says:

    Tá de parabéns, acertou de primeira

  11. Gabriel Viragine says:

    Valeu Liu, resolveu meu problema tb.

  12. André Carvalho says:

    Liu, resolveu o meu problema, também!
    Uso o JBoss 5.1 em JDK 1.6.017, sendo chamado de dentro do Eclipse. Fiz a alteração do launch configurations e funcionou. Obrigado!

  13. Marcelo Bento says:

    Amigo, tenho um webservice no jboss e estou com uma classe principal aqui onde to tentando executar via Run As > Java Application e está dando este erro que vc citou. Pode me ajudar?

    • rafaelliu says:

      Não entendo como tu pode estar tentando executar como Java Application. Está usando Endpoint.publish()? Nesse caso não tem nada a ver o caso relatado no post.. De qualquer modo, é um problema de classpath.

  14. Marcelo says:

    Valeu! Depois de uma googlada achei seu post!
    Obrigado!

  15. Ivan Viragine says:

    Mais um salvo! Valeu Liu!

Leave a Reply