#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
заявления. Теперь это работает. Спасибо.