4

RestEasy 2.3.4 を使用しています。NPE に遭遇しています。私はジェネリック基本クラス ValueContainer を持っています。これは、ジェネリック パラメータを適切な型に置き換えることによって、StringValue、IntegerValue、BooleanValue などとして拡張する予定です。

以下に示すように、拡張クラスをデータ転送オブジェクトとして使用して実験しています。ただし、JAXB 処理で NPE に遭遇しています。つまり、JAXB の拡張クラスを正しく扱っていません。お知らせ下さい。それを行う正しい方法は何ですか?ありがとうございました。

基本クラス:

@XmlAccessorType(XmlAccessType.FIELD)
public class ValueContainer<T> {
  @XmlAttribute
  protected T value;

  public ValueContainer() {
  }

  public ValueContainer(T value) {
    this.value = value;
  }

  public T getValue() {
    return value;
  }

  public void setValue(T value) {
    this.value = value;
  }
}

拡張クラスの例:

@XmlRootElement (name="integervalue")
public class IntegerValue extends ValueContainer<Integer> {

  public IntegerValue() {
  }

  public IntegerValue(Integer value) {
    super(value);
  }
}

jax-rs API インターフェース:

@GET
@Path("/status/{what}")
IntegerValue getStatus(@PathParam ("what")Integer what) ;

API 実装:

@Override
public
IntegerValue getStatus(Integer what) {
  return new IntegerValue(what);
}

ブラウザが http:.../status/1 を呼び出すと、config が null を返す NPE の原因:

package org.jboss.resteasy.plugins.providers.jaxb;

.....
protected JAXBContext createContextObject(Annotation[] parameterAnnotations, Class... classes) throws JAXBException
{
  JAXBConfig config = FindAnnotation.findAnnotation(parameterAnnotations, JAXBConfig.class);
  return new JAXBContextWrapper(config, classes);
}
4

1 に答える 1

0

で例外をスローする必要があると思いますpublic ValueContainer()。この ctor が存在するのは、JAXB が public no-arg コンストラクターを必要とするためだけです ( What JAXB needs a public no-arg constructor for? を参照してください)。オブジェクトが引数なしでインスタンス化され、valuenull のままになります (Java コンパイラが文句を言わないのは奇妙です)。

于 2012-12-05T12:22:11.270 に答える