0

我有一个带有此类响应的 Java 后端响应休息请求:

import java.util.Collection;
import java.util.Collections;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

import org.codehaus.jackson.map.annotate.JsonSerialize;

@XmlRootElement
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class RestResponse<T> {
  @XmlElement(name = "METADATA")
  private JsonMetadata  jsonMetadata;
  private Collection<T> result;

  public RestResponse() {
    jsonMetadata = new JsonMetadata();
  }

  public RestResponse(JsonMetadata metadata) {
    this.jsonMetadata = metadata;
  }

  public JsonMetadata getJsonMetadata() {
    return jsonMetadata;
  }

  public void setJsonMetadata(JsonMetadata jsonMetadata) {
    this.jsonMetadata = jsonMetadata;
  }

  public Collection<T> getResult() {
    return result;
  }

  public void setResult(Collection<T> result) {
    this.result = result;
  }

  public void setObjectList(Collection<T> objectList) {
    if (objectList != null) {
      this.result = objectList;  
    }    
  }

  public void setObject(T object) {
    if (object != null) {
      setObjectList(Collections.singletonList(object));
    }
  }

  public void setErrorMessage(String msg) {
    jsonMetadata.setErrorMessage(msg);
  }

  public void setWarnMessage(String msg) {
    jsonMetadata.setWarnMessage(msg);
  }

}

并且可以发送如下内容:

METADATA: {STATUS: "0", ERROR_MESSAGE: ""} 
result: [{id: "4010", name: "Demo"}]

现在我正在尝试使用 Apache Syncope 并想使用 Maven 工件,例如 read hear:

https://syncope.apache.org/docs/reference-guide.html#client-library

但是当我添加这行时:

<dependency>
  <groupId>org.apache.syncope.client</groupId>
  <artifactId>syncope-client-lib</artifactId>
  <version>2.1.2</version>
</dependency>

到我在 Eclipse 中的项目中的 pom.xml。只添加这一行,不要做任何其他事情,然后其余响应更改为:

jsonMetadata: {status: "0", errorMessage: ""}
result: [{id: "4010", name: "Demo"}]

对我来说是个问题,因为我用这个“元数据”这个词来管理错误。

有谁知道为什么会发生这种变化?

4

1 回答 1

0

在这种情况下,您仅在第一个字段 JsonMetadata 中定义 @XmlElement(name = "METADATA")。请记住,Java 只能将此注释获取到它下面的第一个字段!

当我创建 xml 时,我更喜欢在他们的 get 方法中使用符号,例如:

@XmlRootElement(name = "root")  
public class RestResponse<T> {


@XmlElement(name = "metadata")
public JsonMetadata getJsonMetadata() {
    return jsonMetadata;
}

public void setJsonMetadata(JsonMetadata jsonMetadata) {
    this.jsonMetadata = jsonMetadata;
}

public void setResult(<any> result) {
    this.result = result;
}

@XmlElement(name="result")
public <any> getResult() {
    return result;
}

请记住:您必须为每个字段创建 setter 和 getter!使用正确的名称(我使用 netbeans ide,它会自动建议使用正确的名称添加此方法)。

但是还有另一种解决方案...

@XmlAccessorType(XmlAccessType.FIELD)
public class RestResponse<T> {
@XmlElement(name = "METADATA")
private JsonMetadata  jsonMetadata;
private Collection<T> result;
//...

在上课前用这个符号,你可以解决你的问题。所以有两种方法:-添加方法(我更喜欢这个)-添加这个符号(没有添加或触摸任何东西,我不喜欢,因为该方法更有用)

不能同时使用这两种解决方案!

于 2018-11-30T17:48:15.293 回答