2012-04-15 2 views
1

Netbeans를 사용하여 웹 응용 프로그램 프로젝트를 만듭니다. IDE는 새로운 웹 서비스 (코드 WS)를 만들 때 METRO2.0 라이브러리를 추가합니다. SOAP 웹 서비스는 아파치 Tomcat 6에 잘 전개되어있다. 그러나 복잡한 유형을 보낼 때 클라이언트는 클라이언트에서 보낸 객체의 메소드에 액세스 할 수 없다. SOAP를 통해 전송되는 객체의 메소드 표시

public class Person { 

    private String name, surname; 
    private int age; 

    public Person() { 

    } 
    public Person(String name, String surname, int age) { 
     this.name = name; 
     this.surname = surname; 
     this.age = age; 
    } 

    public int getAge() { 
     return age; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getSurname() { 
     return surname; 
    } 
} 

그래서 어떻게 클라이언트가 사람 방법을 알고 할 수 있습니다

@WebMethod(operationName = "getOnePerson") 
    public Person getOnePerson() { 

     return new Person("MyName", "MySurname", 24); 
    } 

그리고 Person 클래스 : 내가 사람라는 클래스와 수술을 말해? 감사 편집이 : 나는 Pesron의 속성을 추가하여 내 XSD 파일을 업데이트 시도했다 :

<xs:complexType name="person"> 
     <xs:attribute name="name" type="xs:string" /> 
     <xs:attribute name="surname" type="xs:string" /> 
     <xs:attribute name="age" type="xs:int" /> 
    </xs:complexType> 

이 부분을 추가함으로써, 클라이언트는 Person 클래스의 게터 & 세터를 알고 있지만, 프로그램을 실행하려고 할 때,

public class Main { 

    public static void main(String[] args) { 

     try { 
      Person p = getOnePerson(); 
      System.out.println(p); 
      System.out.println(p.getSurname()); 
      System.out.println(p.getName()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    private static Person getOnePerson() { 
     com.company.ws.BeanWebService_Service service = new com.company.ws.BeanWebService_Service(); 
     com.company.ws.BeanWebService port = service.getBeanWebServicePort(); 
     return port.getOnePerson(); 
    } 
} 

반환 : 모든 게터는 (클라이언트 측) null를 돌려 [email protected] 널 널 클라이언트가 클래스 속성의 다른 값을 모르는 이유를 말해 주시겠습니까? JAX-WS는/비 정렬 화 객체를 마샬링하는 JAXB를 사용하기 때문에

+0

클래스를 클라이언트에 복사 할 수 있습니다. 하지만 JVM은 모든 속성의 주소 메모리를 해결할 수 있습니까? 실제로 클라이언트는 메소드가없는 com.company.ws.Person이라는 새로운 유형을 자동으로 생성합니다. 같은 이름의 다른 클래스를 만들면 문제가 발생할 수 있습니다. 그렇지 않니? –

답변

0

:

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlType; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType (name = "Person", propOrder = {"name","surname", "age"}) 
public class Person { 
    @XmlElement(name="name",required = true) 
    private String name; 

    @XmlElement(name="surname",required = true) 
    private String surname; 

    @XmlElement(name="age",required = true) 
    private int age; 

//GETTER & SETTER 
} 

가 감사를!

0

, 내가 추천 :

  • 이 같이 생성 된 Person 클래스를 사용하여이 XSD의 JAXB 클래스를 생성 한 사람에 대한 XSD를 정의 웹 서비스의 유형을 반환 당신이 메이븐을 (추천), 당신은 XSD에서 JAXB 클래스를 생성하기 위해 다음과 같은 플러그인을 사용할 수 있습니다 사용하는 경우

:

 <plugin> 
      <groupId>org.jvnet.jaxb2.maven2</groupId> 
      <artifactId>maven-jaxb2-plugin</artifactId> 
      <version>0.8.1</version> 
      <executions> 
       <execution> 
        <id>generate</id> 
        <goals> 
         <goal>generate</goal> 
        </goals> 
        <configuration> 
         <generatePackage>com.yourcompany.somecomponent.somepackage.jaxb</generatePackage> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

예상 XSD & xjb (JAXB 사용자 지정 파일) 위치 : SRC/메인/자원 내가 발견하고 문제 해결 무슨

+0

좋아, 내가 알다시피, xsd 파일은 클라이언트 클래스와 매핑을 수행합니다. 그렇지 않니?나는 http://www.coderanch.com/에 KEY1 VALUE1 KEY2 VALUE2 를 사용하여 HashMap의를 보내는 예를 발견했습니다 t/415853/웹 서비스/java/JAXB 매핑 -HashMap. 너가 말하는게 이거니? –

+0

XSD는 프로그래밍 언어에 중립적 인 방식으로 웹 서비스의 데이터 구조를 지정합니다. JAXB는 XSD를 준수하는 XML 문서로 Java POJO를 마샬링/언 마샬링 할 수 있습니다. 따라서 HashMap이 아닌 손으로 작성한 Person 클래스와 비슷한 Person 클래스를 계속 가질 수 있습니다. – Puce

+0

설명해 주셔서 감사합니다. IDE가 이미 WS를 매핑하는 xsd 파일을 생성 한 것으로 나타났습니다. 이해할 수 있듯이이 파일을 수정하여 Person 객체를 매핑해야합니다. http://hpics.li/2686848 –

관련 문제