【问题标题】:How to pass java Object from client to Webservice如何将java对象从客户端传递到Webservice
【发布时间】:2019-07-16 16:15:47
【问题描述】:

您好,我对 Web 服务很陌生,我正在尝试将 java 对象传递给我创建的 Web 服务,其中它有一个采用 java 对象的 Web 方法。我在下面附上我的代码。

Web 服务类:

@WebService
public class WsTicketService {

    WsTicketStore ticketstore =  new WsTicketStore();

    @WebMethod
    public void createTicket(Ticket ticket) {
        System.out.println("Requested to store a new ticket");
        Ticket myTicket = ticketstore.storeNewTicket(ticket.getReporter(), ticket.getTopic(),ticket.getDescription(), ticket.getType(), ticket.getPriority());
        System.out.println("Ticket Stored");
    }
}

创建票证的客户端类 我想将此票证发送到上述 Web 服务,但我在 service.createTicket(Ticket) 线上收到错误,表明该类型不适用于参数。

public class WsTicketManagementBackend implements TicketManagementBackend {
    HashMap<Integer, Ticket> localTicketStore = new HashMap<>();
    AtomicInteger nextId;


    WsTicketServiceService client;
    WsTicketService service;

    public WsTicketManagementBackend() {
        nextId = new AtomicInteger(1);

        this.client = new WsTicketServiceService();
        service = client.getWsTicketServicePort();
    }

    @Override
    public void triggerShutdown() {

    }

    @Override
    public Ticket createNewTicket(String reporter, String topic, String description, Type type, Priority priority) {
        Ticket ticket = new Ticket(nextId.getAndIncrement(), reporter, topic, description, type, priority);
        localTicketStore.put(ticket.getId(), ticket);
        service.createTicket(ticket);
        return (Ticket) ticket.clone();
    }

该界面由wsimport工具生成:

public interface WsTicketService {


    /**
     * 
     * @param arg0
     */
    @WebMethod
    @RequestWrapper(localName = "createTicket", targetNamespace = "http://implementation.remote.ws.backend.rz.uniba.de/", className = "de.uniba.rz.backend.ws.remote.implementation.CreateTicket")
    @ResponseWrapper(localName = "createTicketResponse", targetNamespace = "http://implementation.remote.ws.backend.rz.uniba.de/", className = "de.uniba.rz.backend.ws.remote.implementation.CreateTicketResponse")
    @Action(input = "http://implementation.remote.ws.backend.rz.uniba.de/WsTicketService/createTicketRequest", output = "http://implementation.remote.ws.backend.rz.uniba.de/WsTicketService/createTicketResponse")
    public void createTicket(
        @WebParam(name = "arg0", targetNamespace = "")
        Ticket arg0);

}

【问题讨论】:

  • 嗯,您是否尝试过传递一个对象,然后将其转换为 Ticket?这可能是一种解决方法,或者传递一个带有属性的 Json 来构建票证对象并在您的 createTicket 方法中构建它,因此它将直接接收一个 json 字符串而不是票证对象。
  • 对于 json 部分,我是否已在 web 服务类的 createTicket 中将票证类型更改为字符串?
  • 发布整个错误。
  • 是的,您的方法 createTicket(Ticket ticket),现在需要接收 String jsonTicket。所以在这个 createTicket(String jsonTicket) 方法中,您可以将 Ticket 对象的每个属性设置为 jsonTicket 的每个属性。

标签: java xml soap jaxb jax-ws


【解决方案1】:

您可以尝试发送带有 Ticket 对象属性的 json 字符串,然后创建它,如下所示:

createTicket(String jsonTicket){
// Instantiate a jsonObject (you can use any json library you want, I recommend PrimeFaces JSONObject)
JSONObject json = new JSONObject(jsonTicket);
// So here you make a new ticket
Ticket ticket = new Ticket();
// Set the properties of the ticket to each attribute of your json
ticket.setName(json.getString("name"));
// and so on
}

【讨论】:

    【解决方案2】:

    我使用 JAXB 解决了这个问题,方法是将 java 对象编组到客户端的 xml 文档,然后在 Web 服务器端解组回 java 对象。

    【讨论】:

      猜你喜欢
      • 2015-05-10
      • 1970-01-01
      • 2012-11-18
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      相关资源
      最近更新 更多