Jaxb 및 cxf를 사용하면 Enum에 "인수가 없는 기본 생성자가 없습니다"

StackOverflow https://stackoverflow.com/questions/1429509

  •  07-07-2019
  •  | 
  •  

문제

클라이언트가 내 SOAP 웹 서비스에서 사용되는 클래스를 사용 및 확장하는 일부 코드에서 java2ws를 실행하는 데 문제가 있습니다.아직 혼란스러우신가요?:)

SOAP 웹 서비스(JBoss5, Java 6)를 노출하고 있습니다.누군가가 Axis1을 사용하여 해당 웹 서비스를 사용하고 데이터 유형 및 클라이언트 스텁이 포함된 항아리를 생성하고 있습니다.그런 다음 그들은 내 유형 중 하나를 확장하는 자체 유형을 정의합니다.내 유형에 열거형이 포함되어 있습니다.

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()

내가 정의한 열거형은 아래와 같습니다.이제 소비된 후 나오는 방식은 다음과 같습니다. 앱 서버에서 정의한 방식은 다음과 같습니다.


@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;
    }
}

온라인에서 본 내용과 다음과 같은 다른 게시물을 본 적이 있습니다.이 하나) Jaxb가 목록이나 그와 유사한 것을 처리할 수 없다는 점에 대해 설명했지만 내 열거형에 대해 당황스러워요.열거형에 대한 기본 생성자를 가질 수 없다고 확신합니다(적어도 인수가 없는 공용 생성자라면 Java가 시도할 때 소리를 지릅니다). 그래서 이 오류가 발생하는 원인이 무엇인지 잘 모르겠습니다.어떤 아이디어가 있나요?

또한 "IllegalAnnotationsExceptions 2개"는 내 코드에 실제로 유사하게 작성된 두 개의 열거형이 있기 때문일 수 있지만 간결성을 위해 이 예제에서는 생략했습니다.

도움이 되었습니까?

해결책

JAXB의 인수가 없는 생성자는 다음과 같을 필요가 없습니다. public, 그것은 될 수 있습니다 private:

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

MyEnumType(String v) {
    value = v;
}

당신은 유지할 수 없습니다 value 회원 final 그래도 이쪽으로.

다른 팁

열거형에 대한 기본 생성자를 가질 수 있다고 확신합니다.실제로, 당신이 생성자를 설명자를 설명하지 않으면 (문자열 매개 변수와 같은).

인수가 없는 생성자와 다른 생성자를 포함하여 여러 생성자를 가질 수도 있습니다.


제시한 정확한 예에서는 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에 저장하고 필요에 따라 읽을 수도 있습니다.

from-java-to-wsdl을 수행할 때 처음에는 Apache 검사가 열거형 클래스인지 아닌지 확인하고 이 검사가 실패한 경우에만 생성자를 확인합니다.org.apache.axis.wsdl.fromJava.Types::isBeanCompatible에서 확인할 수 있습니다.평범한 사람이라면 누구나 글을 쓴다고 생각할 것이다.

public enum MyEnum{} 

그것으로 충분할 것이다.그러나 Apache 개발자는 그렇게 생각하지 않습니다(IDK는 호환성상의 이유가 있을 수 있음).그들은 이 방법을 수행합니다 - org.apache.axis.utils.JavaUtils::isEnumClassSub.

이 클래스를 분리하면 열거형이 다음과 같이 표시됩니다.

  1. public String getValue() {return name();}을 구현해야 합니다.
  2. public MyEnum fromString(String v){return valueOf(v);}를 구현해야 합니다.
  3. public void setValue(){}를 포함할 수 없습니다.
  4. String toString()을 구현해야 하지만 각 객체는 이를 구현합니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top