Создание объекта с JSON Опубликовать запрос - PullRequest
0 голосов
/ 19 апреля 2020

Я создаю Rest API с JAX-RS (Джерси) и Джексоном для обработки JSON объектов. Я хочу позволить пользователю создать объект Brand, увидев запрос на публикацию с сыновым телом, в котором заполнены только некоторые поля бренда POJO.

Это моя сущность Brand:

@Data
@Entity
@NoArgsConstructor
public class Brand {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String name;
    private int founded;
    private String founder;
    private String ceo;
    private String headQuarters;


    private Date created;
    private Date updated;


    @Transient
    private List<Link> links = new ArrayList<>();

    public Brand(String name){
        this.name = name;
    }

    public void addLink(String href, String rel, String action){
        Link link = new Link(href, rel, action);
        links.add(link);
    }

    @PrePersist
    protected void onCreate() {
        created = new Date();
    }

    @PreUpdate
    protected void onUpdate() {
        updated = new Date();
    }

}

Если пользователь отправит следующее JSON тело:

{
    name:"brand-name",
    founded:1974
}

Я хочу новый объект Brand с только этими двумя значениями, созданным и идентификатором, который будет установлен, остальное должно быть значение NULL. Есть ли способ для меня создать новый объект с этими значениями, когда JSON не маршалинг? Или я должен принять его как JsonObject, а затем проверить, какие значения указаны, а затем создать новый объект с ними?

Ответы [ 3 ]

0 голосов
/ 19 апреля 2020

Мне удалось найти ответ на этот вопрос. Должно быть, я написал что-то не так при тестировании, но Джерси уже делает именно то, что я прошу. Просто указав тип POJO, в который вы хотите превратить JSON, объект будет создан, и для всех ни одного из указанных полей будет установлено значение по умолчанию. Если вы затем добавите его в базу данных, добавятся Id и созданная временная метка. Отличный материал!

0 голосов
/ 20 апреля 2020

Это зависит от того, как была создана конечная точка. например, вы можете реализовать это так

@Path("/brands")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response processData(Brand aBrand)
{
    // In this way, the same entity will be automatically created and you can use it
    System.out.println(aBrand.getName());

}



//or 

@POST
@Path("/brands")
@Consumes(MediaType.APPLICATION_JSON)
public Response processData(InputStream inputStream) 
{
        //read json string data in inputStream
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        StringBuilder out = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            out.append(line);
        }

       String jsonStringData = out.toString();

}```
0 голосов
/ 19 апреля 2020

По моему опыту, самый простой способ сделать это - использовать библиотеку JSON от Google - Gson (https://github.com/google/gson) или любую другую библиотеку JSON .

С помощью библиотеки вы можете сделать это, чтобы получить данные, отформатированные так, как вам нравится

Brand aBrandObject = new Brand();
//set values
aBrandObject.setName("Google")
// ..........
String jsonData = new Gson().toJson(aBrandObject);
...