Я использую Spring boot уже пару лет, но недавно я столкнулся с необычной ошибкой. При вызове GET API весеннего загрузочного приложения из моего приложения angular он возвращает меньшее количество строк, чем фактическое число, присутствующее в БД.
Вышеупомянутая проблема решается в момент повторного развертывания приложения весенней загрузки. Подозревая, что это какая-то проблема с кэшированием, я сохранил этот заголовок.
Примечание. Я не включил кэширование в приложении.
Другой подозреваемый объект - EntityManager, не получающий обновилась. Я использую репозиторий Spring для извлечения данных, менеджер объектов не обрабатывается моим пользовательским кодом. Итак, я не уверен, как это может произойти.
Я использую экземпляр AWS RDS postgresql в качестве своей базы данных.
После двух дней неудачного преследования я поместил его здесь для мнений экспертов
@Data
@EntityListeners(AuditingEntityListener.class)
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "uid_gen_seq")
@SequenceGenerator(name = "uid_gen_seq", allocationSize = 1)
@Column(name = "user_id", updatable = false, nullable = false)
private long userId;
private String name;
private String address;
@Column(name = "ph_no")
private String phNo;
@Column(name = "rent_pass")
private int rentPass;
@CreatedBy
private String createdBy;
@LastModifiedBy
private String modifiedBy;
}
Метод контроллера:
@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<List<UserVO>> getAllUsers()
throws Exception, NoContentException {
return ResponseEntity.ok(userService.getAllUsers());
}
Метод обслуживания:
@Override
public List<UserVO> getAllUsers() throws NoContentException {
logger.info("Get all users");
List<User> users = userRepository.findAll();
List<UserVO> userVOs = converter.convertToVO(users);
return userVOs;
}
Обновление:
Я думаю, что я сузил возможные случаи до 1. Это сессия не обновляется. Насколько я понимаю, вызов метода репозитория неявно создает сеанс и закрывает его. Если метод службы или контроллера не был аннотирован @ Transactional.
Методы службы в моем случае не были аннотированы @Transactional, тем не менее сеанс не получал refre sh.
В качестве обходного пути я аннотировал методы с помощью @Transactional (TxType.REQUIRED_NEW), чтобы избежать использования любого старого сеанса. На данный момент это работает, но я все еще не убежден в поведении приложения без этого обходного пути.