Отправить комплекс Obj (с картой) по телу POST - JSON - PullRequest
1 голос
/ 06 апреля 2019

У меня есть объект со структурой ниже:

class MyObject{
    private String firstString;
    private BigDecimal bigDecimal;
    private NestedObject nestedObject;
    private Map<String, String> map;
}

И я хотел бы создать POST вызов через Почтальон с ниже JSON:

{
  "firstString": "first",
  "bigDecimal": 1.2222,
  "nestedObject": {
    "secondString": "second"
  },
  "param1": "paramValue1",
  "param2": "paramValue2",
  "param3": "paramValue3"
}

Я также пытался:

{
  "firstString": "first",
  "bigDecimal": 1.2222,
  "nestedObject": {
    "secondString": "second"
  },
  "customMap" :{ 
     "param1": "paramValue1",
     "param2": "paramValue2",
     "param3": "paramValue3"
  }
}

Я хотел бы трактовать param1, param2, param3 как Map ключ - значение , потому чтопараметры будут неизвестны (количество элементов может быть 1 или 1000), и я хотел бы проанализировать его как один из шагов после получения этого тела.

NestedObject - это точно вложенный объект с известной структурой.

@POST
@Path("/")
@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_JSON})
public String getEntity( MyObject myObject){

  //sth
}

Когда я делаю это точно так же, как и выше, после вызова я получаю объект, но переменная карты является нулевой.Как я могу решить эту проблему, у вас есть какие-либо идеи?

РЕДАКТИРОВАТЬ дополнительную информацию: @lealceldeiro Ниже вы можете найти мой код, есть ли какие-либо "подозрительные" части?

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import java.util.HashMap;
import java.util.Map;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
class SearchParamsFromRequest {

    private NestedObject nestedObject;

    private String surname;
    private String type;
    private String userName;

    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<>();

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }
}
    @POST
    @Path("/")
    @Consumes({MediaType.APPLICATION_JSON})
    public String getString (SearchParamsFromRequest searchParameters){

        return "Any String";
    }

1 Ответ

1 голос
/ 06 апреля 2019

Для этого вы можете использовать com.fasterxml.jackson.annotation .

import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;

public class MyObject {

    private String firstString;
    private BigDecimal bigDecimal;
    private NestedObject nestedObject;
    @JsonIgnore
    private Map<String, Object> map = new HashMap<>();
    // you can change it to Map<String, String> if you know they will always
    // be string - string, be consistent with `setAdditionalProperty`

    @JsonAnyGetter
    public Map<String, Object> getMap() {
        return this.map;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.map.put(name, value);
    }
    // getters and setters omitted
    // REMEMBER to follow the java beans naming conventions
    // for example call the setters and getters such as `setFirstName` and `getFirstName` for the `firstName` attribute
}

Это (http://www.jsonschema2pojo.org/) может помочь вам получитьклассы, сгенерированные из таких источников, как JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...