Axis 2 의 매개 변 수 를 깊이 있 게 분석 하여 복잡 한 사용자 정의 유형 값[단계 접근 실천 편]

6278 단어 자바webservice
―Axis 2 에 서 는 복잡 하고 사용자 정의 대상 을 전달 할 수 있 을 까?
  틀림없이
  이전 블 로 그 는 Axis 2 의 반환 값 을 사용자 정의 대상 과 복잡 한 유형 으로 깊이 분석 했다.예 를 들 어 List유형 이다.
  이 블 로 그 는 사용자 대상 이나 List인자 와 같은 Axis 2 의 매개 변 수 를 사용자 정의 대상 으로 설명 합 니 다.
  
우선 매개 변 수 는 User 대상 입 니 다.
  서버 쪽 은 평소 와 같다.아니면 최초의 문서 로 만 들 까?그 중 하 나 는 다음 과 같다.
 
   public User getUserName(User u){
           User user= new User();
           user.setAge(u.getAge()+10);
           user.setName( "^"+u.getName()+ "^");
           user.setId(u.getId()+1);
            return user;
     }

 
 그럼 우리 클 라 이언 트 는 어떻게 전달 합 니까?
 물론 우 리 는 Axiom 방식 을 사용한다.
 Axiom 에서 전 달 된 매개 변 수 는 OMElement 형식 이 어야 하기 때 문 입 니 다.그래서?우 리 는 사용자 정의 대상 을 OMElement 대상 으로 바 꿔 야 합 니 다.
 그럼 어떻게 바 꿔 요?
 
   // user        omElment  
     public static OMElement castElment(User u){
             javax.xml.stream.XMLStreamReader reader = BeanUtil.getPullParser(u);
             StreamWrapper parser = new StreamWrapper(reader);
             StAXOMBuilder stAXOMBuilder =OMXMLBuilderFactory.createStAXOMBuilder(OMAbstractFactory. getOMFactory(), parser);
             OMElement element = stAXOMBuilder.getDocumentElement();
             return element;
     }

 그럼 전 환 된 OMElement 결 과 를 계속 분석 해 볼 까요?
 OMElement param=
castElment
(u);
  
//출력 변환 후의 omElement 대상
 System.
 
out
.println(param);
 결 과 는 다음 과 같다.
 
100이사
 실제로 전 달 된 것 은 xml 입 니 다.
 main 방식 은 다음 과 같 습 니 다.
 
 public static void main(String[] args) throws Exception {
           EndpointReference targetEPR = new EndpointReference("http://localhost:8080/testWSServerByAxis2/services/myService?wsdl" );
     try {
                Options options = new Options();
                options.setTo(targetEPR);
                
                 //       
                ServiceClient sender = new ServiceClient();
                sender.setOptions(options);
                
                OMFactory fac = OMAbstractFactory.getOMFactory();
                OMNamespace omNs = fac.createOMNamespace("http://test.com" , "" );
                 //        
                OMElement method = fac.createOMElement("getUserName" , omNs);
                 //        ,      omNode  。            omNode  
                 //           omNode  
                User u= new User();
                u.setId(0);
                u.setAge(10);
                u.setName( "  ");
                OMElement param= castElment(u);
                 //      omElement  
                 System.out.println(param);
                method.addChild(param);
                 //  OMElement  
                OMElement result = sender.sendReceive(method);
                 System.out.println("clientResult="+result);
                 Iterator iterator=result.getChildElements();
                 while(iterator.hasNext()){
                      System.out.println("ok");
                     OMNode omNode = (OMNode) iterator.next();
                      if(omNode.getType()==omNode. ELEMENT_NODE){
                           OMElement omElement = (OMElement) omNode;
                           System.out.println("***="+omElement.getLocalName());
                            if (omElement.getLocalName().toLowerCase().equals("return" )) {
                                User u1 = (User) BeanUtil.processObject(omElement, User. class, null, true, new DefaultObjectSupplier());
                                 System.out.println(u1.getName());
                           }
                     }
                }
           } catch (Exception e) {
                e.printStackTrace();
           }
     }

  아니면 이전 블 로그 의 반환 값 에 따라 얻 은 결 과 는 다음 과 같다.
 
  clientResult=<ns:getUserNameResponse xmlns:ns="http://test.com"><ns:return xmlns:ax21="http://entity.com/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ax21:User"><ax21:age>20</ax21:age><ax21:id>1</ax21:id><ax21:name>^  ^</ax21:name></ns:return></ns:getUserNameResponse>

  그 다음으로 List대상 을 전달 하면?
  'List'를 어떻게 전달 할 지 생각해 보 세 요.소식 으로 바 뀌 면 어 떨 까?
  전달 매개 변 수 는 반드시 OmElement 이 어야 하기 때문에 List 가 어떻게 전 환 된 OmElement 대상 을 볼 까요?
 
 
      // List        omElment  
     public static OMElement castElment(List<User> userList){
            //    OMFactory   
            OMFactory factory = OMAbstractFactory. getOMFactory();
           OMNamespace omNamespace = factory.createOMNamespace("http://test.com" , "" );
           OMElement omElement = BeanUtil. getOMElement(new QName("root"), userList.toArray(), new QName("user"), false, null);
            return omElement;    
     }

 
그 변환 후의 출력 결 과 는:
   <root><user><age>10</age><id>0</id><name>  0</name></user><user><age>11</age><id>1</id><name>  1</name></user><user><age>12</age><id>2</id><name>  2</name></user></root>

 출력 된 OMElement 를 주의 깊 게 관찰 합 니 다.그 중 에는 use 태그 가 포함 되 어 있 습 니 다.이렇게 다음 에 이러한 List 반환 값 을 얻 는 OMElement 는 user 에서 꺼 내 대상 으로 밀봉 하면 됩 니 다.
  그리고 주의 가 필요 합 니 다.
:BeanUtil. 
getOMElement 방법의 첫 번 째 매개 변 수 는 null 일 수 없습니다.출력 은 대상 밖 에 탭 이 있 습 니 다.세 번 째 매개 변 수 는 패 키 징 대상 의 태그 이름 입 니 다.
   
 
  이렇게 되면 Axis 2 는 기본적으로 정상적으로 사용 에 들 어 갈 수 있다.Axis 2 에 서 는 복잡 한 사용자 정의 형식 을 xiom 방식 으로 처리 할 수 있 지만 솔직히 전환 이 필요 합 니 다.하지만 CXF 에 서 는 별로 귀 찮 지 않 았 다.직접 전달 하면 됩 니 다.
   그러나 사람 이 완벽 하지 않다 는 것 은 Axis 2 의 인터페이스 매개 변수 가 무엇 인지,서 비 스 를 발표 한 후 생 성 된 wdl 의 element 의 이름 은 인터페이스 매개 변수 이름과 같다.하지만 CXF 에 서 는 달 랐 다.CXF 가 주석 없 이 이름 을 바 꾸 면 기본 적 인 상황 은 arg 0,arg 1 입 니 다.
   따라서 모든 것 이나 우리 자신 에 게 도 장점 을 살 리 고 단점 을 피해 야 합 니 다.(*^ ^*)

좋은 웹페이지 즐겨찾기