Как исключить метаданные Weld из сериализации объекта JSON - PullRequest
0 голосов
/ 09 июля 2019

Предположим, что следующий ресурс REST:

@Path("/ActiveLeadTask")
//Also possible MediaType.APPLICATION_XML
@Produces(MediaType.APPLICATION_JSON)
public class ActiveLeadTask {
    private @Inject ActiveLeadTaskBo activeLeadBo;

    @GET
    @Path("/getBo")
    public ActiveLeadTaskBo getBo() {
        return activeLeadBo;
    }
}
////////////////////////////////////////////////////
@XmlRootElement
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
public class ActiveLeadTaskBo implements Serializable {
    private static final long serialVersionUID = 1L;

    private String firstName;

    private String lastName;

    private String phoneNumber;
    private String phoneCountryCode;

    private AtomicInteger accessCounterField = new AtomicInteger(0);

    public ActiveLeadTaskBo() {
        firstName = "test";
        lastName = "test";
    }

    public int getAccessCounter() {
        return accessCounterField.incrementAndGet();
    }

    public void setAccessCounter(int seed) {
        accessCounterField.set(seed);
    }

    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

Ответ REST для getBo () JSON (но не для XML) возвращает следующее:

{
  "accessCounter": 1,
  "firstName": "test",
  "lastName": "test",
  "metadata": {
    "contextualInstance": {
      "accessCounter": 2,
      "firstName": "test",
      "lastName": "test"
    },
    "instance": {
      "accessCounter": 3,
      "firstName": "test",
      "lastName": "test"
    }
  }
}

Ответ JSON содержит дополнительное поле «метаданные» - как я могу настроить проект так, чтобы он не генерировался или не генерировался? Контейнером CDI является Weld, а сериализатор JSON предоставлен Yasson.

1 Ответ

0 голосов
/ 17 июля 2019

Возможны два решения:

  • создайте класс-оболочку, например, ActiveLeadTaskBoInjectWrapper:
@Inject
ActiveLeadTaskBoInjectWrapper activeLeadBo;


activeLeadBo.getInstance();
  • Особенности обхода сварного шва:
@Inject
Foo foo;

public void doSomething() {
  if (foo instanceof WeldClientProxy) {
    // foo is a proxy
    ((WeldClientProxy)foo).getMetadata().getContextualInstance()
  } else {
    // not a proxy
  }
}
...