2016-03-07 78 views
0

尝试使用spring集成ws来使用webservice,在web服务端我得到一个空指针,因为它似乎传递的对象没有被编组或未映射在xml中,下面是客户端调用调用该服务。当soap消息调用web服务时的空指针

public class Main { 

public static void main(String[] args) { 
    ClassPathXmlApplicationContext context 
      = new ClassPathXmlApplicationContext("springws.xml"); 
    MessageChannel channel = context.getBean("request", MessageChannel.class); 

     String body = "<getPojo xmlns=\"http://johnson4u.com/\"><pojo>\n" 
      + " <pojoId>23</pojoId>\n" 
      + " <pojoName>dubic</pojoName>\n" 
      + "</pojo></getPojo>"; 

    MessagingTemplate messagingTemplate = new MessagingTemplate(); 
    Message<?> message = messagingTemplate.sendAndReceive(
      channel, MessageBuilder.withPayload(body).build()); 

    System.out.println(message.getPayload()); 
} 

的WSDL由JAXWS端点类

package com.johnson4u; 


    import javax.jws.WebService; 
    import javax.jws.WebMethod; 
    import javax.jws.WebParam; 


@WebService(serviceName = "SpringService") 
public class SpringService { 


@WebMethod(operationName = "getPojo") 
public Pojo getPojo(@WebParam(Pojo pjRequest){ 
    //Null Pointer occurs here as pjRequest might not be mapped to xml 

    System.out.println("Pojo name is "+pjRequest.getPojoName()); 

    return new Pojo(234,"IM new Pojo"); 
} 

而且POJO

package com.johnson4u; 


public class Pojo { 

private int pojoId; 
private String pojoName; 

public Pojo(int pojoId, String pojoName) { 
    this.pojoId = pojoId; 
    this.pojoName = pojoName; 
} 


public int getPojoId() { 
    return pojoId; 
} 

public void setPojoId(int pojoId) { 
    this.pojoId = pojoId; 
} 

public String getPojoName() { 
    return pojoName; 
} 

public void setPojoName(String pojoName) { 
    this.pojoName = pojoName; 
} 

可惜genrated中,wsdl正确的StackOverflow着的格式,但名称空间ID是基于包名称com.johnson4u,以下是spring-ws-context.xml

<int:channel id="request" />  
<int:channel id="response" /> 

<ws:outbound-gateway id="gateway" 
         request-channel="request" 
         uri="http://localhost:20151/SpringWs/SpringService?wsdl"/> 

回答

0

我改变了网络参数值的方式来

@WebMethod(operationName = "getPojo") 
    public Pojo getPojo(@WebParam(name = "pojo") Pojo pjRequest){ 

    System.out.println("Pojo name is "+pjRequest.getPojoName()); 

    return new Pojo(234,"IM new Pojo"); 
} 
    } 

和XML请求到

 String body = "<ns0:getPojo xmlns:ns0=\"http://johnson4u.com/\">\n" + 
"    <pojo>" 
      + "<pojoId>456</pojoId>" 
       +"<pojoName>Johnson</pojoName>" 
       + "</pojo>\n" + 
     "  </ns0:getPojo>"; 
1

我相信对象是非编组的,你需要指定对象类中的元素。

public class Pojo { 
    @XmlElement(name="pojoId", required=true, namespace=YOUR_NAME_SPACE) 
    private int pojoId; 
    @XmlElement(name="pojoName", required=true, namespace=YOUR_NAME_SPACE) 
    private String pojoName; 

    // Getters and Setters ...... 
} 
2

我相信串身体要

String body = "<ns:getPojo xmlns:ns=\"http://johnson4u.com/\"><pojo>\n" 
      + " <pojoId>23</pojoId>\n" 
      + " <pojoName>dubic</pojoName>\n" 
      + "</pojo><ns:/getPojo>"; 

命名空间的符号 'NS' 没有被列入