#spring #spring-boot #spring-data
#spring #spring-boot #spring-данные
Вопрос:
Я создал объекты User и Order, как показано ниже. Чего я хочу добиться, так это того, что если http://localhost:8080/users/username? дано, я хочу вернуть только информацию о пользователе на основе предоставленного имени пользователя. если http://localhost:8080/users/username ?detail=true, я хочу вернуть данные пользователя и детали заказа для указанного имени пользователя. Как я могу этого добиться?
User.java
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String userName;
private String password;
private String firstName;
private String lastName;
private String gender;
private String lastLoggedIn;
@OneToMany
List<Order> listOfOrder;
//constructors
//getter and setter
}
Order.java
@Entity
public class Order
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private float amount;
private String createdAt;
private String deliveredDate;
//constructors
//getter and setter
}
Controller.java
//CREATE CUSTOMER
@RequestMapping(method = POST, value = "/create")
public ResponseEntity createCustomerDetails(@RequestParam String userName, String password, String firstName,
String lastName, String gender) {
String lastLogged = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(Calendar.getInstance().getTime());
User user = new User(userName, password, firstName, lastName, gender, lastLogged);
userRepository.save(user);
return ResponseEntity.status(OK).body(user.getId() " User were successfully saved");
}
//CREATE ORDER
@RequestMapping(method = POST, value = "/order/{userName}")
public ResponseEntity createOrder(@PathVariable ("userName") String userName, @RequestParam float amount)
{
String createdAt = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(Calendar.getInstance().getTime());
String deliveredDate = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(Calendar.getInstance().getTime());
User user = orderService.findUser(userName);
if (!user.equals(null))
{
Order order = new Order(amount,createdAt,deliveredDate);
user.getListOfOrder().add(order);
return ResponseEntity.status(OK).body("order details were saved under " user.getUserName() " " user.getFirstName());
}
return ResponseEntity.status(NOT_FOUND).body(null " was not found");
}
//GET THE USER DETAILS
@RequestMapping(method = GET, value = "/users/{userName}")
public ResponseEntity getUserDetail(@PathVariable("userName") String userName,
@RequestParam(defaultValue ="none", required = false) String detail) {
if (!detail.equals("none")){
return .....;
}else {
return ........;
}
}
Пользовательское хранилище
@Repository
public interface UserRepository extends CrudRepository<User, Long> {
User findByUserName(String userName);
}
Ответ №1:
Если вы согласны с выполнением сериализации вручную, вы можете использовать JsonView, чтобы определить, что будет сериализовано.
https://www.baeldung.com/jackson-json-view-annotation
User.java
import com.fasterxml.jackson.annotation.JsonView;
public class User {
@JsonView(Views.Lite.class)
private String name;
@JsonView(Views.Full.class)
private List<Order> orders;
}
Views.java
public class Views {
public static class Lite {}
public static class Full extends Lite {}
}
UserController.java
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Autowired
private UserRepository userRepository;
@Autowired
private ObjectMapper mapper;
@GetMapping("/user/{username}")
public ResponseEntity<String> getUserDetail(@PathVariable String username, @RequestParam(required = false) String detail) throws JsonProcessingException {
User user = userRepository.findByUserName(username);
Class viewClass = Views.Lite.class;
if (!StringUtils.isEmpty(detail)) {
viewClass = Views.Full.class;
}
return ResponseEntity.status(HttpStatus.OK)
.body(mapper.writerWithView(viewClass).writeValueAsString(user));
}
}