#java #spring-boot #netflix-zuul #api-gateway
#java #весенняя загрузка #netflix-zuul #api-шлюз
Вопрос:
У меня есть одна специфическая проблема, когда объект set в ответе json не всегда отображается для одного и того же запроса.
Ниже приведен класс ответа json
public class EmployeeEntity implements Serializable {
/** The id. */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long employeeEntityId;
/** The name. */
@Column(name = "name", length = 45, unique=true)
private String employeeName;
/** The description. */
@Column(name = "instruction", columnDefinition = "mediumtext")
private String description;
/** The employee permissions. */
@ManyToMany(fetch = FetchType.LAZY)
@Fetch(FetchMode.JOIN)
@JoinTable(name = "employee_has_permissions", joinColumns = {
@JoinColumn(name = "employee_id", referencedColumnName = "id") }, inverseJoinColumns = {
@JoinColumn(name = "employee_permissions_id", referencedColumnName = "id") })
private Set<EmployeePermissionEntity> employeePermissions;
//setters and getters
}
В локальной среде это работает отлично. Но в среде разработки для того же запроса, который имеет разрешения сотрудника, периодически разрешение сотрудника не отображается в ответе. Я не могу понять, что здесь происходит не так. Не могли бы вы, пожалуйста, помочь мне здесь.
РЕДАКТИРОВАТЬ: я сталкиваюсь с этой проблемой с zuul gateway. После дальнейшего анализа я мог видеть, что всякий раз, когда теги отсутствуют, вызов не поступал в приложение. Означает ли это, что шлюз частично кэширует ответ? Если да, то как предотвратить это или заставить его кэшировать полный ответ.
Это код построения ответа.
HttpServletResponse response; //received as method parameter
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
if (LOGGER.isInfoEnabled()) {
LOGGER.info("Construct resposne : ");
}
final EmpResponseModel empResponse = new EmpResponseModel(firstName,
lastName, token, id, employeeEntity.employeePermissions());
final ResponseModel responseModel = new ResponseModel(OK, "Operation completeted successfully.", null,
new ResponseModel<EmpResponseModel>(empResponse));
try (OutputStream out = response.getOutputStream()) {
final ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON_NULL);
//mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.writeValue(out, responseModel);
out.flush();
} catch (Exception exception) {
if (LOGGER.isInfoEnabled()) {
LOGGER.info("Exception while writing response : " exception);
}
}
Комментарии:
1. Если я правильно помню, это может быть связано с типом выборки. ЛЕНИВЫЙ — моя память довольно расплывчата, но вы пытались установить для него значение eager?
2. Поскольку @Fetch(FetchMode.JOIN) находится там, он заботится об этом. Он отлично работает в локальной среде. Я пробовал с 20-25 последовательными запросами.