웹 서비스 개발 에서 흔히 볼 수 있 는 네 가지 문 제 를 상세 하 게 풀다.

12993 단어 xmlwebserviceSOAP
웹 서비스 개발 에서 흔히 볼 수 있 는 네 가지 문 제 를 상세 하 게 풀다.
질문 1: WebService 및 방법 재 업로드
우선 웹 서 비 스 는 재 업로드 방법 을 지원 하지 않 습 니 다.다음은 예 를 들 어 설명 한다.
예 를 들 어 다음 웹 서비스 인 터 페 이 스 를 정의 합 니 다.
1 @WebService
2 public interface IHello {
3         @WebMethod
4         public String sayHello(int id);
5 
6         @WebMethod
7         public String sayHello(String name);
8         
9         @WebMethod
10         public String sayHello2(int id);
11 
12         @WebMethod
13         public String sayHello2(int id, String name);
14     }

먼저 방법 sayHello () 를 살 펴 보고 클 라 이언 트 가 다음 과 같은 SOAP 요청 을 보 내 면:
1 <soap:Envelope>
2         <soap:Body>
3             <sayHello>
4                 <arg0>11</arg0>
5             </sayHello>
6         </soap:Body>
7     </soap:Envelope>

SOAP 요청 을 통 해 클 라 이언 트 가 호출 방법 을 sayHello () 로 해 야 하 는 것 을 알 수 있 습 니 다. 전달 하 는 매개 변 수 는 11 이지 만 정수 11 인지 문자열 '11' 인지 알 수 없 기 때문에 호출 하 는 방법 이 어느 것 인지 알 수 없습니다.
다음은 sayHello 2 () 를 살 펴 보 겠 습 니 다. 만약 에 클 라 이언 트 가 전달 하 는 매개 변수 가 하나의 id 값 만 포함 된다 면 예 를 들 어:
1 <soap:Envelope>
2         <soap:Body>
3             <sayHello2>
4                 <arg0>1</arg0>
5             </sayHello2>
6         </soap:Body>
7     </soap:Envelope>

클 라 이언 트 가 전달 하 는 두 번 째 인자 가 비어 있 기 때문에 호출 하 는 방법 이 무엇 인지 판단 할 수 없습니다.
일반적으로 리 셋 방법 이 포 함 된 웹 서 비 스 를 발표 할 때 이상 이 발생 하거나, 하나의 방법 을 호출 할 때 서버 측 보고 서 는 대응 하 는 방법 을 찾 지 못 합 니 다.
문제 2: 내 데이터 가 수정 되 었 습 니까?
웹 서비스 인터페이스 먼저 보기:
1 @WebService
2     public interface IHello {
3     
4         @WebMethod
5         public String sayHello(IPerson person);
6     
7     }
8     
9     public interface IPerson {
10         ...
11     }
12     
13     public class Person implements IPerson{
14         ...
15     }

여기 서 주의해 야 할 것 은 웹 서비스의 방법 sayHello () 의 매개 변 수 는 구체 적 인 클래스 가 아 닌 인터페이스 입 니 다 (예 를 들 어 Aegis 바 인 딩 은 이러한 웹 서 비 스 를 직접 발표 할 수 있 습 니 다).클 라 이언 트 가 sayHello () 를 호출 할 때 Person 대상 을 전달 하여 IPerson 인 터 페 이 스 를 실현 합 니 다.중간 일련의 XML 과 대상 간 의 전환 과정 을 거 쳐 서버 에서 얻 은 것 은 IPerson 인 터 페 이 스 를 실현 한 실례 일 뿐이다. 이것 은 반드시 Person 대상 이 아니 라 강제로 Person 으로 전환 하려 면 이상 을 던 질 수 있다.
문 제 는 Aegis 가 XML 을 자바 대상 으로 바 꾸 는 것 이 프 록 시 나 CGlib 같은 도 구 를 통 해 '프 록 시 클래스' 를 만들어 IPerson 인 터 페 이 스 를 실현 한 다음 에 이 프 록 시 클래스 의 인 스 턴 스 를 만 드 는 것 이다. 그것 은 Person 이 아 닐 것 이다.
질문 3: 반복 참조
예 를 들 어 보 겠 습 니 다.다음은 웹 서비스의 인터페이스 입 니 다.
1 @WebService
2     public interface IHello {
3     
4         @WebMethod
5         public String sayHello(Teacher teacher);
6     
7     }
8     
9     public class Teacher {
10         private Student[] students;
11         
12         //getters and setters
13         ...
14     }
15     
16     public class Student {
17         private Teacher teacher;
18         
19         //getters and setters
20         ...
21     }

Teacher 와 Student 는 한 쌍 이 넘 는 '쌍방 향' 관계 라 는 점 에 유의 하 세 요.이런 상황 에서 우 리 는 어떻게 Teacher 대상 을 XML 로 바 꿀 수 있 는 지 생각해 볼 수 있다.
당신 은 아래 의 답 을 생각 할 수 있 습 니 다.
1 <teacher>
2         <students>
3             <teacher>
4                 <students>
5                     <teacher>
6                         <students>
7                             ...
8                         </students>
9                         ...
10                     </teacher>
11                 </students>
12                 ...
13             </teacher>
14         </students>
15         
16         <students>
17             ...
18         </students>
19         ...
20     </teacher>

보 셨 죠? XML 도 '사순환' 에 들 어 갑 니 다.문제 의 근원 은 대상 간 의 순환 인용 에 있다.이 문 제 는 클 라 이언 트 가 WebService 요청 을 보 내기 전에 이상 을 던 집 니 다. 이 대상 을 전송 가능 한 XML 로 변환 할 수 없 기 때 문 입 니 다.
문제 4: 거대 한 물건
아니면 예 를 들 어 웹 서비스의 인터페이스 입 니 다.
1 @WebService
2     public interface IHello {
3     
4         @WebMethod
5         public String sayHello(Student[] students);
6     
7     }
8     
9     public class Teacher {
10         ...
11     }
12     
13     public class Student {
14         private Teacher teacher;
15         
16         //getters and setters
17         ...
18     }

이 방법 은 한 Student 배열 을 받 아 수백 수천 명의 Student 를 포함 하 는데 위의 예 와 달리 Student 와 Teacher 는 현재 다 대 1 의 단 방향 관계 이기 때문에 '순환 인용' 문 제 는 없 을 것 이다.이 모든 Student 의 Teacher 가 한 사람 이 라 고 가정 해 봐.우 리 는 이 Student 배열 의 대상 을 XML 로 바 꾸 려 고 합 니 다. 다음 과 같 습 니 다.
1 <student>
2     <teacher>
3                 ...
4         </teacher>
5     </student>
6 <student>
7     <teacher>
8                 ...
9         </teacher>
10     </student>
11     ...

문제 가 나 왔 습 니 다. 보 셨 습 니까? 모든 Student 노드 아래 에 Teacher 노드 가 있 습 니 다. 이 XML 이 수신 자가 Student 배열 로 바 뀌 었 을 때 모든 학생 들 은 자신의 선생님 이 있 었 습 니 다. Teacher 대상 은 수백 수천 번 복사 되 었 습 니 다. 이런 전환 - 전송 - 전환 과정 을 거 쳐 이 배열 의 대상 은 정말 '거대 한 물건' 이 되 었 습 니 다.
문 제 는 스 튜 던 트 와 티 처 간 관계 가 다 대 일 로, '다' 자 를 전송 할 때 '1' 자가 여러 차례 복 제 될 수 있다 는 점 에서 비롯 됐다.대량의 네트워크 전송 대역 폭 과 메모 리 를 점용 합 니 다.여기 서 매개 변 수 는 반드시 하나의 집합 이나 배열 이 아 닙 니 다. 예 를 들 어 ObjectA 와 ObjectB 는 모두 ObjectC 에 대한 인용 이 있 습 니 다. SOAP 를 통 해 전송 한 후에 ObjectC 는 하나 에서 두 개 로 바 뀌 었 습 니 다. 각각 ObjectA 와 ObjectB 에 속 하고 더 이상 ObjectC 를 공유 하 는 것 이 아 닙 니 다.

좋은 웹페이지 즐겨찾기