Spring-boot mongodb — как преобразовать сохраненный ответ MongoRepository в пользовательский класс и вернуть как JSON

#java #mongodb #spring-boot

Вопрос:

Я пытаюсь учиться spring-boot с mongodb помощью . Я следил за онлайн-статьями и учебными пособиями, и пример приложения отлично работает для возврата строки в качестве ответа API. Но когда я пытаюсь вернуть ответ в формате JSON, используя ResponseEntity , я получаю ошибку.

Вот код:

src/customerapi/model/Customer.java

 package com.customerapi.model;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString

@Document(collation = "customer")
public class Customer {
    @Id
    private String custRefId;
    
    private String title;

    private String firstName;
    
    private String middleName;

    private String lastName;
    
    private String businessName;

    private String email;

    private String phone;

    private String note;
    
    private String dateOfBirth;

    private String sex;
    
    
}
 

src/customerapi/dto/CustomerResponse.java

 package com.customerapi.dto;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonInclude.Include;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
@JsonInclude(Include.NON_NULL)
public class CustomerResponse {
    @JsonProperty("custRefId")
    private String custRefId;
    
}
 

src/customerapi/repository/CustomerRepository.java

 package com.customerapi.repository;

import org.springframework.data.mongodb.repository.MongoRepository;

import com.customerapi.dto.CustomerResponse;
import com.customerapi.model.Customer;

public interface CustomerRepository extends MongoRepository<Customer, String> {
}
 

src/customerapi/resource/CustomerController.java

 package com.customerapi.resource;

import static java.util.concurrent.TimeUnit.MILLISECONDS;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

import com.customerapi.repository.CustomerRepository;
import com.customerapi.model.Customer;
import com.customerapi.dto.CustomerResponse;

@RestController
public class CustomerController {
    
    @Autowired
    private CustomerRepository customerRepository;
    
    @PostMapping(value="/addCustomer", produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseStatus(HttpStatus.CREATED)
    public ResponseEntity<CustomerResponse> saveCustomer(@RequestBody Customer customer) {
        
        try {
            return new ResponseEntity<CustomerResponse>(new customerRepository.save(customer), HttpStatus.CREATED);
        }finally {
            System.out.println("Issue with saving data in DB");
        }
    }
}
 

Возвращение a string из saveCustomer() работает нормально. Но когда я пытаюсь вернуться ResponseEntity<CustomerResponse> и попасть в конечную точку в Postman, я получаю эту ошибку.

ошибка почтальона

Я искал в Интернете и пробовал несколько вещей из ответов stackoverflow, но, похоже, у меня ничего не получается.

**Как мне преобразовать MongoRepository save ответ в пользовательский класс и вернуть его в формате JSON с помощью ResponseEntity ? **

Комментарии:

1. Ошибка говорит о том, что у вас нет конструктора. Создание @NoArgsConstructor и @AllArgsConstructor в пользовательском ответе

2. @varman Добавление конструктора, как предложено в приведенном ниже ответе, помогло мне решить проблему. Спасибо.

Ответ №1:

Здесь new CustomerResponse(customerRepository.save(customer)) . Внутри CustomerResponse нет конструктора, который принимает Customer в качестве параметра. Вы можете его создать. Так что ваш CustomerResponse будет выглядеть вот так.

 import com.customerapi.model.Customer;

@Getter
@Setter
@ToString
@JsonInclude(Include.NON_NULL)
public class CustomerResponse {
    @JsonProperty("custRefId")
    private String custRefId;
    
    public CustomerResponse(Customer customer){
        this.custRefId = customer.getCustRefId();
    }
}
 

Комментарии:

1. @Валай ты какой Customer объект взамен или просто custRefId ?

2. Я обновил код CustomerController.java до return new ResponseEntity<CustomerResponse>(new customerRepository.save(customer), HttpStatus.CREATED); . Я попробовал использовать предложенный вами подход, но все равно получил ту же ошибку.

3. Обновите код CustomerResponse . Нет CustomerController

4. Да, я обновил код, CustomerResponse как и предлагалось. В описании вопроса я обновил CustomerController . Ошибка остается прежней.

5. Извините, что это была моя ошибка-удалить new CustomerResponse из ResponseEntity заявления. Теперь это работает. Спасибо.