2009-09-15 7 views
2

&을 사용하는 코드 일부에서 클라이언트가 java2ws를 실행하는 데 문제가있어서 SOAP 웹 서비스에서 사용되는 클래스가 확장됩니다. 아직 혼란스러워? :)열거 형 Jaxb 및 cxf와 함께 "인수없는 기본 생성자가 없습니다"

SOAP 웹 서비스 (JBoss5, Java 6)가 노출됩니다. 누군가 Axis1을 사용하여 웹 서비스를 사용하고 있으며 데이터 유형과 클라이언트 스텁으로 jar 파일을 만듭니다. 그런 다음 내 유형 중 하나를 확장하는 자체 유형을 정의합니다. 내 형식에 열거 형이 포함되어 있습니다.

class MyParent { 
private MyEnumType myEnum; 

// getters, settters for myEnum; 
} 

class TheirChild extends MyParent { 
... 
} 

그들이 (내 클래스를 확장하는) 자신의 코드에 java2ws를 실행하는, 그들은

Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions 
net.foo.bar.MyEnuMType does not have a no-arg default constructor. 
    this problem is related to the following location: 
      at net.foo.bar.MyEnumType 
      at public net.foo.bar.MyEnumType net.foo.bar.MyParent.getMyEnum() 

내가 정의한 열거 형은 다음과 같습니다 얻을. 이것은 소비 후 나오는 방법 지금,하지만 나는 그것을 응용 프로그램 서버에 정의하는 방법은 다음과 같습니다 목록을 처리하기 위해 JAXB의 무능력에 대한 (this one)처럼, 나는 온라인으로 일을 본 적이

 

@XmlType(name = "MyEnumType") 
@XmlEnum 
public enum MyEnumType { 

    Val1("Val1"), 
    Val2("Val2") 

    private final String value; 

    MyEnumType(String v) { 
     value = v; 
    } 

    public String value() { 
     return value; 
    } 

    public static MyEnumType fromValue(String v) { 
     if (v == null || v.length() == 0) { 
      return null; 
     } 

     if (v.equals("Val1")) { 
      return MyEnumType.Val1; 
     } 
     if (v.equals("Val2")) { 
      return MyEnumType.Val2; 
     } 
     return null; 
    } 
} 
 

및 기타 게시물 또는 그런 것들,하지만 난 내 열거에 대해 당황 스럽다. 나는 당신이 enum을위한 기본 생성자를 가질 수 없다는 것을 확신한다. (적어도 public-no-arg 생성자, Java는 나에게 시도 할 때 소리를 지른다.) 그래서이 에러를 가능하게하는 것이 확실하지 않다. 어떤 아이디어?

또한 "2 count of IllegalAnnotationsExceptions"는 내 코드에 실제로 비슷한 두 개의 enum이 있기 때문에 가능하지만 간결함을 위해이 예제에서 제외했습니다.

+0

그것은 기술의 이상한 조합입니다. java2ws는 Apache CXF입니다. 맞습니까? Java5 기반입니다. Axis1은 고대이며 Java5 이전 버전입니다. 무슨 일 이니? – skaffman

+0

클라이언트가 프로젝트 1을 위해 WSDL을 소비하고 사용하고있었습니다. 프로젝트 2가 프로젝트 2와 함께 왔고 (우리는 axis1 wsdl2java를 사용하여 얻은) 객체를 가져 와서 랩핑하고 CXF를 통해 이들을 내보내려고합니다. 다른 사람. 따라서 첫 번째 부분 (WSDL을 소비하고 사용하는 것)이 작동하는 것으로 보이지만, axis1 소비에서 나온 java2ws 객체를 시도하는 것은 꽤 까다 롭습니다. – Dave

답변

9

JAXB의 인수 없음의 생성자는 private 될 수 public 될 필요가 없습니다 : 당신은 그래도 value 회원 final 이런 식으로 계속 할 수

private String value; 
private MyEnumType() {} // for JAXB 

MyEnumType(String v) { 
    value = v; 
} 

.

+0

이것이 서버 측 XML 유형에서 완료되면 wsconsumed 될 때 다운 전파되거나 생성 된 .java 파일 (wsdl2java의 출력)으로 편집해야합니까? – Dave

+0

당신의 설정이 확실하지 않지만, JAXB를 사용하여 enum에서 WSDL이 생성된다는 것을 이해하고 있으므로 서버 측 열거 형 정의에서이 작업을 수행해야합니다. –

2

열거 형의 기본 생성자를 사용할 수 있습니다. 사실, 생성자를 명시 적으로 정의하지 않으면 (문자열 매개 변수를 사용하는 경우처럼) 입니다.

또한 여러 개의 생성자, 하나의 인수가없는 생성자 등을 가질 수 있습니다.


정확한 예에서 String 매개 변수는 모두 피하는 것이 간단합니다. 제공된 name() 메소드는 사용자가 제공 한 값과 정확하게 일치합니다. 당신은 또한 당신의 다양한 값을 저장할 수, 각 값으로 설정하는 정말 일부 복잡한 매개 변수가있는 경우

@XmlType(name = "MyEnumType") 
    @XmlEnum 
    public enum MyEnumType { 

    Val1, Val2; 

    public String value() { 
     return name(); 
    } 

    public static MyEnumType fromValue(String v) { 
     for(MyEnumType type : values()) { 
     if (type.value().equals(v)) { 
      return type; 
     } 
     } 
     return null; 
    } 
    } 

, 때문에 라이브러리의 특정 생성자를 가질 수 없습니다 : 코드는 더 간단 할 것 EnumMap에 넣고 필요에 따라 읽으십시오.

0

-java-to-wsdl에서 아파치가 처음에는 열거 형 클래스인지 아닌지를 확인하고이 검사가 실패 할 경우에만 생성자를 확인합니다. org.apache.axis.wsdl.fromJava.Types :: isBeanCompatible에서 볼 수 있습니다. 어떤 평범한 사람이라도 그가 쓰면 그가 생각할 것입니다.

public enum MyEnum{} 

충분합니다.그러나 아파치 개발자들은 그렇게 생각하지 않는다 (IDK는 왜, 어떤 호환성의 이유로있을 수있다). 그들은이 메소드 (org.apache.axis.utils.JavaUtils :: isEnumClassSub)를 수행합니다.

이 클래스를 decomile 경우, 당신은 볼 것이다, 당신의 열거 그

  1. 공공 문자열 getValue는() {반환 이름();} 구현해야
  2. 공공 MyEnum fromString를 구현해야합니다 (문자열 V)
  3. public void setValue() {}
  4. 은 String toString()을 구현해야하지만 각 객체는이를 구현해야합니다.