2013-08-20 2 views
0

Я работаю над приложением, которое я хочу использовать, чтобы поймать SOAP-запрос, когда он входит в CXFServlet. Есть некоторая обработка, которую я должен сделать для конверта SOAP на стороне сервера, прежде чем CXFServlet обработает его.Apache CXF Request/Response

Я предполагаю, что конверт SOAP, когда он достигает серверной стороны, является одним из параметров объекта HTTPServletRequest. Но, глядя на то, что приходит (используя отладчик, конечно), я не могу его найти.

Может ли кто-нибудь сказать мне, куда идет запрос SOAP, когда клиент отправляет его на сервер? Я знаю, что клиент отправляет запрос с помощью HTTP POST, и я знаю, что сервер использует информацию в запросе, чтобы получить доступ к соответствующему методу веб-службы, а затем помещать любые возвращаемые значения из метода в ответ SOAP и возвращать это клиенту. Мне нужно знать, где находится CXFServlet (или один из его фильтров), чтобы получить информацию SOAP? Это где-то в параметрах? В контексте сервлета? Обрабатывает ли фильтр информацию SOAP до того, как она попадет в CXFServlet? Как я могу получить этот конверт и делать что-то к нему до того, как будет вызван метод веб-службы?

Кто-то пожалуйста, сообщите ...

+0

Вы хотите получить исходный запрос? – Gourabp

ответ

0

вы хотите получить доступ первоначальный запрос ли? Если да, сам объект запроса или ответа может быть доступен с помощью объекта WebServiceContext.

Во-первых, объявить закрытое поле для WebServiceContext в вашей реализации услуг и аннотировать его в качестве ресурса

@Resource частный контекст WebServiceContext;

Затем в вашей реализации методов, вы можете получить доступ к MessageContext, HttpServletRequest и HttpServletResponse следующим образом:

MessageContext CTX = context.getMessageContext();

HttpServletRequest request = (HttpServletRequest) ctx.get (AbstractHTTPDestination.HTTP_REQUEST);

Более подробную информацию о WebServiceContext см по следующему адресу: http://docs.oracle.com/javase/6/docs/api/javax/xml/ws/WebServiceContext.html

0

Если вам нужно, чтобы перехватить запрос, прежде чем он когда-либо обрабатывается CXFServlet, вы должны смотреть на разработку Servlet Filter.

Если вы хотите обработать сообщение SOAP до того, как CXF сделает, вы можете использовать CXF Interceptor. Фазы, указанные в документации, указывают точки, которые вы можете перехватить сообщение. В зависимости от того, что вы хотите сделать/измените, вам может понадобиться играть с фазами.

Исходный код SoapHeaderInterceptor или SoapActionInInterceptor CXF был бы хорошим местом для начала работы с SOAP-сообщением.

+0

Patrick: Вы близки к тому, что я ищу, но я должен быть более точным: что я хочу сделать, это отправить запрос сервлету, который выполняет некоторую обработку и «внедряет» SOAP-конверт в CXFServlet. Идея состоит в том, что CXF должен обрабатывать конверт SOAP, как это обычно бывает, но я создаю этот конверт из другого сервлета. Возможно ли это с CXF? –

+0

Есть ли причина, по которой сервлет, получающий запрос, не может просто действовать как клиент jaxws для веб-службы CXF? Это кажется более простым подходом.Вы также можете попытаться использовать CXF Interceptor для изменения входного потока сообщения, прежде чем CXF начнет его обрабатывать. Я не уверен, что это означало бы «ввести» SOAP-конверт в CXFServlet. Возможно, вы могли бы описать проблему, которую пытаетесь решить? – Patrick

+0

Собственно, да. Мне нужно напрямую манипулировать конвертом SOAP, а в некоторых случаях создавать пользовательские запросы SOAP. Идея заключается в том, что запрос не SOAP отправляется на Servlet A, Servlet A генерирует запрос, а затем перенаправляет его в CXFServlet. Или клиент отправляет SOAP-запрос на Servlet B, Servlet B производит некоторые изменения и дополнения, а затем перенаправляет измененный запрос в CXFServlet. Важное значение имеет непосредственная манипуляция конвертом SOAP, независимо от CXFServlet - что-то, что я не могу сделать с клиентом сервлетов или перехватчиками ... –