Как можно сохранить детали заказа, связанные с пользователем, и как я могу вернуть данные заказа, связанные с деталями пользователя, на основе параметров URL?

#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));
   }
}