문제
축을 사용하여 샘플 웹 서비스를 모델링하고 있습니다. 내가 지금하고있는 일은 자동화 된 WSDL 및 코드 생성의 한계가 무엇인지 이해하려고 노력하는 것입니다.
이제 일부 서버 사이드 코드의 경우 :
이것은 샘플 웹 서비스의 골격입니다.
public class TestWebService {
public AbstractAttribute[] testCall( AbstractAttribute someAttribute ) {
....
그리고 내 데이터 클래스 : 공개 추상 클래스 AbstractAttribute {문자열 이름;
/*get/set for name*/
public abstract T getValue();
public abstract void setValue(T value);
}
public class IntAttribute extends AbstractAttribute<Integer> {
Integer value;
public Integer getValue(){ return value; }
public void setValue(Integer value){ this.value = value; }
}
public class StringAttribute extends AbstractAttribute<String> {
String value;
/* ok, you got the point, get/set for value field */
}
Axis2 용 Eclipse 도구는 속성 클래스의 스키마를 포함하여 이러한 소스에서 WSDL을 생성하는 것을 매우 기쁘게 생각합니다.
<xs:complexType name="AbstractAttribute">
<xs:sequence>
<xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="value" nillable="true" type="xs:anyType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="IntAttribute">
<xs:complexContent>
<xs:extension base="xsd:AbstractAttribute">
<xs:sequence>
<xs:element minOccurs="0" name="value" nillable="true" type="xs:int"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="StringAttribute">
<xs:complexContent>
<xs:extension base="xsd:AbstractAttribute">
<xs:sequence>
<xs:element minOccurs="0" name="value" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
이제 이상한 것을 보면 AbstractAttribute에는 ** achold = "true"** 속성이 없으며 intattribute 및 stirngattribute에서 다시 작성되는 모든 유형 값 요소를 정의합니다. 나는 이것이 법적 스키마인지조차 모른다 (나는 그것이 합법적이라고 생각하지 않는다).
더욱
Object localValue;
필드 및 int/문자열 속성이 정의됩니다
int localValue;
그리고
String localValue;
.. 나는 소스를 "수용"하려고 시도했으며 (많은 희망없이), 결과는 서버가 추상적 인 입학 인스턴스를 인스턴스화하려고 시도한 결과 (인스턴스티션 소지를 던지기).
내 질문은 위의 데이터 모델과 같은 것을 모델링하는 방법이 있거나 웹 서비스 및 XML Schemas ''일반적 으로이 특정 사례에 사용하기에 가장 적합한 도구가 아니십니까?
해결책
직면 한 문제를 설명하기 위해 서비스 호출 할 때 축이해야 할 일을 생각하는 데 도움이됩니다.
Axis는 단순히 Java 웹 응용 프로그램입니다. 서비스 요청을 받으면 정의한 매핑을 찾습니다. 매핑을 찾으면 요청을 서비스하기 위해 정의한 필요한 클래스의 인스턴스를 작성하려고합니다.
클래스를 추상적 또는 인터페이스로 정의한 경우 이러한 유형을 생성 할 수 없으므로 인스턴스티션 외환이 나타납니다. Axis가 WSDL을 만들려고했을 때 어떤 유형을 넣을 것인지 파악할 수 없으므로 "AnyType"을 사용할 수 없습니다.
질문에 답하기 위해 : 코드에 위에있는 모델을 사용할 수 있지만 축 으로이 클래스를 사용할 수는 없습니다. 프로젝트에서 일반적으로 수행 한 것은 다음과 같습니다.
- 일반적인 객체 지향 응용 프로그램에서와 같이 필요한 클래스 정의
- 웹 서비스에 사용되는 "전달 전용"클래스를 정의하십시오. 이 클래스는 간단한 유형으로 구성되며 쉽게 만들 수 있습니다. 웹 서비스 메시지를 교환하는 데만 사용됩니다. 우리는이 클래스를 축으로 사용합니다.
- 이 두 가지 유형의 클래스가 정보를 쉽게 공유/교환 할 수있는 방법을 찾으십시오. 둘 다 공유하는 인터페이스를 가질 수 있지만 (축이 알 수 없음) Beanutils.copyproperites를 사용하여 두 개의 다른 객체를 동기화합니다.
당신의 질문에 대한 답변을 바랍니다.