#java #mongodb #spring-boot
Вопрос:
Я использую Spring Boot с MongoDB. Я новичок в MongoDB.
Чего я пытаюсь достичь, так это когда я получаю вызов на свою конечную точку или когда запрашивается моя конечная точка, я хотел бы создать таблицу в базе данных , которая будет иметь статус REQUESTED
, примененный userID
, а затем поля url
version
, requestedDate
(заполненные при создании таблицы), completedDate
(заполненные при сохранении URL-адреса в базе данных).
После этого я выполняю всю логику, которая мне нужна, в моем случае логика заключается в том, что я должен получить URL-адрес для пользователя и сохранить его в той же таблице, которая была создана при отправке запроса на URL-адрес.
После сохранения URL-адреса в той же таблице, созданной во время запроса, у меня должно быть userId
, url
, version
, requestedDate
, completedDate
и состояние как COMPLETED
.
Код, который у меня есть до сих пор, это:
UserUrl.java
public class UserUrl{ public final MongoUserId mongoUserId; public final Optionallt;Stringgt; url; public final long version; public final Instant requestedDate; public final Instant completeDate; public final State state; public UserUrl(MongoUserId mongoUserId, Optionallt;Stringgt; url, long version, Instant requestedDate, State state) { this.mongoUserId = mongoUserId; this.url = url; this.version = version; this.requestedDate = requestedDate; this.state = state; } public static UserUrl create(MongoUserId mongoUserId){ return new UserUrl( mongoUserId, Optional.empty(), 0, Instant.now(), State.REQUESTED ); } public UserUrl withUrl(String url){ return new UserUrl( this.mongoUserId, Optional.of(url), 0, Instant.now(), State.COMPLETED ); } }
UserController.java
@RequestMapping(value = "/trigger/url/{userId}", method = RequestMethod.GET) public void getUrlForUser(@PathVariable("userId") String userId) { userUrlRepository.save(UserUrl.create(MongoUserId.of(userId))); URL getUrl = userDataService.getUrlUser(userId); String url = getUrl.toString(); if (url != null) { //here I should probably do something to set withUrl method in model return new ResponseEntitylt;gt;(url, HttpStatus.OK); } else { return new ResponseEntitylt;gt;(HttpStatus.NOT_FOUND); } }
Я не уверен, как мне заполнить UserUrl
модель, когда у меня есть URL
?
Кроме того, если я введу completedDate
конструктор, то я предполагаю, что он также будет создан, но тогда какое значение я должен применить к нему?
Любые советы приветствуются 🙂
Ответ №1:
Вы должны использовать сущность , сохраненную с помощью CrudRepository
, обновлять ее и сохранять снова, если это необходимо:
@RequestMapping(value = "/trigger/url/{userId}", method = RequestMethod.GET) public void getUrlForUser(@PathVariable("userId") String userId) { UserUrl userUrl = userUrlRepository.save(UserUrl.create(MongoUserId.of(userId))); URL getUrl = userDataService.getUrlUser(userId); String url = getUrl.toString(); if (url != null) { userUrlRepository.save(userUrl.withUrl(url)); return new ResponseEntitylt;gt;(url, HttpStatus.OK); } else { return new ResponseEntitylt;gt;(HttpStatus.NOT_FOUND); } }
Редактировать
Чтобы изменить completeDate
по завершении, то есть когда url
свойство будет разрешено, обновите метод withUrl
построителя для распространения this.requestedDate
и инициализации completeDate
в Instant.now()
:
public class UserUrl { public final MongoUserId mongoUserId; public final Optionallt;Stringgt; url; public final long version; public final Instant requestedDate; public final Instant completeDate; public final State state; public UserUrl(MongoUserId mongoUserId, Optionallt;Stringgt; url, long version, Instant requestedDate, Instant completeDate, State state) { this.mongoUserId = mongoUserId; this.url = url; this.version = version; this.requestedDate = requestedDate; this.completeDate = completeDate; this.state = state; } public static UserUrl create(MongoUserId mongoUserId){ return new UserUrl( mongoUserId, Optional.empty(), 0, Instant.now(), null, State.REQUESTED ); } public UserUrl withUrl(String url){ return new UserUrl( this.mongoUserId, Optional.of(url), 0, this.requestedDate, Instant.now(), State.COMPLETED ); } }
Комментарии:
1. Спасибо вам за ваш ответ. Но как мне установить
requestDate
иcompleteDate
? Я понимаю, когда я используюInstant.now()
, что это будет при создании или обновлении. Но, в моем случае, после того, как я обновил таблицу URL-адресом, я хотел бы затем установитьcompleteDate
и оставитьrequestDate
все как было.2. Где
completeDate
заявленное? Я не вижу этого в вашей модели.3. Он должен был быть там, но я не знал, как им пользоваться :/ Я обновил свой вопрос. Я не знал, должно ли это быть также мгновенно или что-то другое?
4. Я обновил свой ответ. Я надеюсь, что это поможет.
5. Спасибо! Это было именно то, что я искал.