【问题标题】:JAX webservice with JAXB return multiple values using a loop带有 JAXB 的 JAX Web 服务使用循环返回多个值
【发布时间】:2012-08-23 01:12:20
【问题描述】:

我编写了一个返回 5 个值的网络服务:

String taskPresentationName_UWL = null; 
String taskActivationTime_UWL = null;   
String taskPriority_UWL = null; 
String taskStatus_UWL = null;   
String taskID_UWL = null;

我的情况是我运行一个循环,我想返回一个包含这些值的列表或数组。

因为它现在是代码,所以我只得到 1 行作为答案。例如:

taskPresentationName_test1、taskActivationTime_test1、taskPriority_test1、taskStatus_test1、taskID_test1

但我想返回的答案应该如下所示:

taskPresentationName_test1,taskActivationTime_test1, taskPriority_test1, taskStatus_test1,taskID_test1

taskPresentationName_test2,taskActivationTime_test2, taskPriority_test2, taskStatus_test2,taskID_test2

....

如何将答案返回到列表或 Xml?

我的代码如下

@WebService(name = "getUWLTasks", portName = "getUWLTasksPort", serviceName = "getUWLTasksService", targetNamespace = "http://sap.com/tutorial/testAPI/")
@Stateless
public class getUWLTasks
{
   @WebMethod(operationName = "getTasks", exclude = false)
   public void getTasks(
      @WebParam(name = "taskPresentationName", mode = WebParam.Mode.OUT) Holder<String> taskPresentationName,
      @WebParam(name = "taskActivationTime", mode = WebParam.Mode.OUT) Holder<String> taskActivationTime,
      @WebParam(name = "taskPriority", mode = WebParam.Mode.OUT) Holder<String> taskPriority,
      @WebParam(name = "taskStatus", mode = WebParam.Mode.OUT) Holder<String> taskStatus,
      @WebParam(name = "taskID", mode = WebParam.Mode.OUT) Holder<String> taskID) {

      String taskPresentationName_UWL = null;
      String taskActivationTime_UWL = null;
      String taskPriority_UWL = null;
      String taskStatus_UWL = null;

      String taskID_UWL = null;

      try
      {    
         TaskInstanceManager taskInstanceManager = BPMFactory.getTaskInstanceManager();
         HashSet<Status> statuses = new HashSet<Status>();
         statuses.add(Status.READY);
         statuses.add(Status.RESERVED);
         statuses.add(Status.IN_PROGRESS);

         Set<TaskAbstract> myTasks = taskInstanceManager.getMyTaskAbstracts(statuses);
         Iterator<TaskAbstract> taskIter = myTasks.iterator();

         while (taskIter.hasNext())
         {    
            TaskAbstract ta = taskIter.next();

            //Get the UWL as it appears        

            java.net.URI taskInstanceId = ta.getId();

            URL taskExecutionURL = taskInstanceManager.generateTaskExecutionUrl(taskInstanceId);
            TaskDetail taskDetail = taskInstanceManager.getTaskDetail(taskInstanceId);

            taskPresentationName_UWL = ta.getPresentationName();
            taskActivationTime_UWL = ta.getCreatedTime().toString();
            taskPriority_UWL = ta.getPriority().toString();
            taskStatus_UWL = ta.getStatus().toString();

            taskID_UWL = ta.getId().toString();

            taskPresentationName.value = taskPresentationName_UWL;
            taskActivationTime.value = taskActivationTime_UWL;
            taskPriority.value = taskPriority_UWL;
            taskStatus.value = taskStatus_UWL;

            taskID.value = taskID_UWL;    
         }
      }
      catch (BPMException e)
      {    
         // TODO Auto-generated catch block
         e.printStackTrace();    
      }
   }
}

【问题讨论】:

    标签: java jaxb


    【解决方案1】:

    我写简单的 WS,一切如你所愿

    @WebMethod(operationName = "getTasks", exclude = false)
       public void getTasks(
          @WebParam(name = "taskPresentationName", mode = WebParam.Mode.OUT) Holder<String[]> taskPresentationName,
          @WebParam(name = "taskActivationTime", mode = WebParam.Mode.OUT) Holder<String[]> taskActivationTime,
          @WebParam(name = "taskPriority", mode = WebParam.Mode.OUT) Holder<String[]> taskPriority,
          @WebParam(name = "taskStatus", mode = WebParam.Mode.OUT) Holder<String[]> taskStatus,
          @WebParam(name = "taskID", mode = WebParam.Mode.OUT) Holder<String[]> taskID)
              {
                 taskPresentationName.value = new String[]{"a1", "a2"}; 
                 taskActivationTime.value = new String[]{"b1", "b2"};
                 taskPriority.value = new String[]{"c1", "c2"};
              }  
    

    回复包含

     <taskPresentationName>a1</taskPresentationName>
     <taskPresentationName>a2</taskPresentationName>
         <taskActivationTime>b1</taskActivationTime>
     <taskActivationTime>b2</taskActivationTime>
         <taskPriority>c1</taskPriority>
     <taskPriority>c2</taskPriority>  
    

    编辑

    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Task 
    {
       String taskPresentationName_UWL;
       //...
       String taskID_UWL;
    
       // getters, setters
    }  
    

    任务

    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Tasks
    {
       @XmlElement
       private List<Task> tasks = new ArrayList<Task>(); 
    
       public List<Task> getTasks()
       {
          return tasks;
       }
    }  
    

    网络方法

    @WebMethod(operationName = "getTasks", exclude = false)
    @WebResult(name = "tasks")
    public Tasks getTasks() {  
    //...  
    }
    

    【讨论】:

    • 我的问题是由于我正在开发的环境的一些限制,我必须只使用一个类来达到预期的结果
    • 使用 String[] 代替 Holder
    • 是的。 @WebParam 没有 out 模式,不支持非持有者类
    • 我完全被你的答案弄糊涂了 :( 我可以返回持有者,例如 5 个变量,但 web 服务的答案是 5 个变量的列表,例如 (var11,var12,var13,var14, var15) (var21,var22,var23,var24,var25) 等等。我也可以用 anwser 返回 5 个不同的 ArrayList,但我不能做的是像复杂类型一样返回 anwser。我不知道如何描述它。需求是有一个 xml 格式的 anwser,例如 Tasks[(var11,var12,var13,var14,var15),(var21,var22,var23,var24,var25)...] 有没有简单的方法来实现它? 提前致谢
    • 对于复杂类型,您需要的不仅仅是“一个类”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    相关资源
    最近更新 更多