Сегодня я успешно прекратил непрерывную рассылку моей формы. Разумеется, этот метод может не всегда работать, но он был прост и хорошо работал для этого конкретного случая.
Я сделал следующее:
Бот, о котором идет речь, по-видимому, не обрабатывает javascript, поэтому я больше не вижу спама. А для человека (с включенным javascript) он работает без каких-либо неудобств или дополнительного взаимодействия вообще. Если у посетителя отключен javascript, он получит четкое сообщение об этом, если он сделает заявку.
Оказывается, что можно получить необработанный XML при помощи Provider< Источник>, таким образом:
import java.io.ByteArrayOutputStream;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.ws.Provider;
import javax.xml.ws.Service;
import javax.xml.ws.ServiceMode;
import javax.xml.ws.WebServiceProvider;
@ServiceMode(value=Service.Mode.PAYLOAD)
@WebServiceProvider()
public class SoapProvider implements Provider<Source>
{
public Source invoke(Source msg)
{
StreamResult sr = new StreamResult();
ByteArrayOutputStream out = new ByteArrayOutputStream();
sr.setOutputStream(out);
try {
Transformer trans = TransformerFactory.newInstance().newTransformer();
trans.transform(msg, sr);
// Use out to your heart's desire.
}
catch (TransformerException e) {
e.printStackTrace();
}
return msg;
}
}
я закончил тем, что не нуждался в этом решении, таким образом, я на самом деле не попробовал этот код сам - возможно, требовалась бы некоторую тонкую настройку для разбираний. Но я знаю, что это - правильный путь для потери работоспособности для получения необработанного XML от веб-сервиса.
(я не уверен, как сделать эту работу, если у Вас абсолютно должен быть объект SOAPMessage, но с другой стороны, если бы Вы собираетесь быть обработкой необработанного XML так или иначе, почему Вы использовали бы объект более высокого уровня?)
Вы можете попробовать вот так.
SOAPMessage msg = messageContext.getMessage();
ByteArrayOutputStream out = new ByteArrayOutputStream();
msg.writeTo(out);
String strMsg = new String(out.toByteArray());