As respostas listadas aqui que o orientam a usar SOAPHandler
estão totalmente corretas. O benefício dessa abordagem é que ela funcionará com qualquer implementação JAX-WS, pois SOAPHandler faz parte da especificação JAX-WS. No entanto, o problema com o SOAPHandler é que ele tenta implicitamente representar a mensagem XML inteira na memória. Isso pode levar a um enorme uso de memória. Várias implementações do JAX-WS incluíram suas próprias soluções alternativas para isso. Se você trabalha com solicitações ou respostas grandes, precisa analisar uma das abordagens proprietárias.
Como você pergunta sobre "o incluído no JDK 1.5 ou melhor", responderei com relação ao que é formalmente conhecido como JAX-WS RI (também conhecido como Metro), que é o que está incluído no JDK.
O JAX-WS RI possui uma solução específica para isso, que é muito eficiente em termos de uso de memória.
Consulte https://javaee.github.io/metro/doc/user-guide/ch02.html#efficient-handlers-in-jax-ws-ri . Infelizmente, esse link está quebrado agora, mas você pode encontrá-lo no WayBack Machine. Vou dar os destaques abaixo:
O pessoal do Metro em 2007 introduziu um tipo de manipulador adicional MessageHandler<MessageHandlerContext>
, proprietário do Metro. É muito mais eficiente do SOAPHandler<SOAPMessageContext>
que não tenta fazer representação DOM na memória.
Aqui está o texto crucial do artigo original do blog:
MessageHandler:
Utilizando a estrutura extensível de manipulador fornecida pela especificação JAX-WS e a melhor abstração de mensagens no RI, introduzimos um novo manipulador chamado MessageHandler
para estender seus aplicativos de serviço da Web. MessageHandler é semelhante ao SOAPHandler, exceto que as implementações dele obtêm acesso aMessageHandlerContext
(uma extensão do MessageContext). Através do MessageHandlerContext, é possível acessar a mensagem e processá-la usando a API da mensagem. Como eu coloquei no título do blog, esse manipulador permite que você trabalhe na Mensagem, que fornece maneiras eficientes de acessar / processar a mensagem, não apenas uma mensagem baseada em DOM. O modelo de programação dos manipuladores é o mesmo e os manipuladores de mensagens podem ser combinados com os manipuladores lógicos e SOAP padrão. Adicionei uma amostra no JAX-WS RI 2.1.3 mostrando o uso do MessageHandler para registrar mensagens e aqui está um trecho da amostra:
public class LoggingHandler implements MessageHandler<MessageHandlerContext> {
public boolean handleMessage(MessageHandlerContext mhc) {
Message m = mhc.getMessage().copy();
XMLStreamWriter writer = XMLStreamWriterFactory.create(System.out);
try {
m.writeTo(writer);
} catch (XMLStreamException e) {
e.printStackTrace();
return false;
}
return true;
}
public boolean handleFault(MessageHandlerContext mhc) {
.....
return true;
}
public void close(MessageContext messageContext) { }
public Set getHeaders() {
return null;
}
}
(citação final da publicação no blog de 2007)
Escusado será dizer que seu manipulador personalizado, LoggingHandler
no exemplo, precisa ser adicionado à sua cadeia de manipuladores para ter algum efeito. É o mesmo que adicionar qualquer outro Handler
, para que você possa procurar nas outras respostas desta página como fazer isso.
Você pode encontrar um exemplo completo no repositório Metro GitHub .