2016-11-23 11 views
1

Я проблему с начала JAXWSProperties в MessageContext из примера WebService, описанного на следующих blogАсинхронный JAX-WS веб-сервиса с использованием Apache CXF и WS-адресация, свойство не JAXWSProperties.INBOUND_HEADER_LIST_PROPERTY инициирована

Существует помощник класса инициации HeaderList объект в getHeaders() метод:

import com.sun.xml.internal.ws.api.SOAPVersion; 
import com.sun.xml.internal.ws.api.addressing.AddressingVersion; 
import com.sun.xml.internal.ws.api.message.HeaderList; 
import com.sun.xml.internal.ws.api.message.Headers; 
import com.sun.xml.internal.ws.developer.JAXWSProperties; 
import com.sun.xml.internal.ws.developer.WSBindingProvider; 

import javax.xml.ws.EndpointReference; 
import javax.xml.ws.Service; 
import javax.xml.ws.WebServiceContext; 

public final class CorrelationHelper<S extends Service> { 

private WebServiceContext wsc; 
private S service; 

public CorrelationHelper(S service, WebServiceContext wsc) { 
    this.service = service; 
    this.wsc = wsc; 
} 

private HeaderList getHeaders() { 
    return (HeaderList)wsc.getMessageContext().get(JAXWSProperties.INBOUND_HEADER_LIST_PROPERTY); 
} 

public <P> P getCorrelatedPort(Class<P> portType) { 
    P port = service.getPort(getReplyTo(), portType); 
    ((WSBindingProvider)port).setOutboundHeaders(Headers.create(AddressingVersion.W3C.relatesToTag, 
                   getMessageId())); 
    return port; 
} 

private EndpointReference getReplyTo() { 
    return getHeaders().getReplyTo(AddressingVersion.W3C, 
            SOAPVersion.SOAP_11).toSpec(); 
} 


private String getMessageId() { 
    return getHeaders().getMessageID(AddressingVersion.W3C, 
            SOAPVersion.SOAP_11); 
} 
} 

этот помощник вызывается из реализации услуг как:

import javax.annotation.PostConstruct; 
import javax.annotation.Resource; 
import javax.jws.HandlerChain; 
import javax.jws.WebService; 
import javax.xml.ws.WebServiceContext; 
import javax.xml.ws.handler.MessageContext; 
import javax.xml.ws.soap.Addressing; 

import dev.home.examples.jobprocessor.client.JobProcessorNotify; 
import dev.home.examples.jobprocessor.client.JobProcessorNotify_Service; 
import dev.home.examples.jobprocessor.client.JobReplyType; 
import dev.home.examples.jobprocessor.handlers.CorrelationHelper; 
import dev.home.examples.jobprocessor.types.JobType; 

@WebService(serviceName = "JobProcessor", 
      targetNamespace = "http://examples.home.dev/jobprocessor", 
      portName = "jobProcessor", 
      endpointInterface = "dev.home.examples.jobprocessor.ws.JobProcessor") 
@HandlerChain(file = "JobProcessor-HandlerChain.xml") 
@Addressing(required = true) 
public class JobProcessorImpl { 
//... 
public void processJob(JobType job) { 

    // do processing 
    int seconds = doJob(); 

    // prepare reply message 
    JobReplyType jobReply = new JobReplyType(); 
    jobReply.setJobId(job.getJobId()); 
    jobReply.setResult(String.format("Job payload %s processed in %d seconds!", 
            job.getPayload(), seconds)); 

    // do correlation and perform the callback 
    JobProcessorNotify jobProcessorNotify = 
     correlationHelper.getCorrelatedPort(JobProcessorNotify.class); 
    jobProcessorNotify.replyFinishedJob(jobReply); 
} 
} 

HeaderList не инициируется во getReplyTo(), а затем возвращается в нуль:

(HeaderList)wsc.getMessageContext().get(JAXWSProperties.INBOUND_HEADER_LIST_PROPERTY) 


Caused by: java.lang.NullPointerException 
    at dev.home.examples.jobprocessor.handlers.CorrelationHelper.getReplyTo(CorrelationHelper.java:67) 
    at dev.home.examples.jobprocessor.handlers.CorrelationHelper.getCorrelatedPort(CorrelationHelper.java:56) 
    at dev.home.examples.jobprocessor.ws.JobProcessorImpl.processJob(JobProcessorImpl.java:61) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:180) 
    at org.apache.cxf.jaxws.JAXWSMethodInvoker.performInvocation(JAXWSMethodInvoker.java:66) 
    at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96) 
    ... 17 more 

хотя заголовок данных SOAP содержит все данные:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:typ="http://examples.home.dev/jobprocessor/types"> 
    <soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"><wsa:Action>http://examples.home.dev/jobprocessor/processJob</wsa:Action><wsa:ReplyTo><wsa:Address>http://CZ407032:8088/mockJobProcessorNotify</wsa:Address></wsa:ReplyTo><wsa:MessageID>uuid:96dd09e2-c448-47c0-902f-7eb95421e232</wsa:MessageID><wsa:To>http://CZ407032:8088/JobProcessor</wsa:To></soapenv:Header> 
    <soapenv:Body> 
     ... 
    </soapenv:Body></soapenv:Envelope> 

ответ

1

Вы используете свойство INBOUND_HEADER_LIST_PROPERTY. Чтение JAX-WS documentation, показывает неприятное предупреждение,

Это свойство ЭКСПЕРИМЕНТАЛЬНЫЙ И МОЖЕТИЗМЕНЯТЬСЯ БЕЗ УВЕДОМЛЕНИЯ В БУДУЩЕМ.

HeaderList и JAXWSProperties классы в com.sun.xml.internal.ws.* пакете. Вы действительно хотите это использовать? Блог датирован в 2012 году, может быть поведение изменилось

Проверьте, если этот простой код возврата не нулевой объект (после введения messageContext как @Resource в службе)

HeaderList hl = (HeaderList) messageContext.get(JAXWSProperties.INBOUND_HEADER_LIST_PROPERTY); 
+0

спасибо за ответ, вы правильный пример старый, но наиболее сложный я нашел для асинхронного WS с ws-адресацией. Также изменение имени пакета на * .internal.ws. * Не очень хорошо ... –

+0

... к вашему намеку, я проверил, что объект MessageContext не имеет нулевого значения и содержит правильную полезную нагрузку, но нет никакого элемента HeaderList (type) как свойство в контексте сообщения. Он не против чтения ID и был: To, но я не могу построить EndpointReference, так или иначе, это реальная проблема для меня. Поэтому мне нужно, чтобы HeaderList вызывал: getHeaders(). GetReplyTo (...) –

+0

Я думаю, что вы можете ввести 'javax.xml.soap.SOAPMessage' и использовать' getHeader' для получения всех заголовков SOAP http://docs.oracle .com/javaee/5/api/javax/xml/soap/SOAPMessage.html и извлеките 'replyTo'. Я не уверен, что вы можете использовать 'Message m = ((WrappedMessageContext) messageContext) .getWrappedMessage()' для 'SOAPMessage' или вам понадобится перехватчик – pedrofb

 Смежные вопросы

  • Нет связанных вопросов^_^