Установленный объект в ответе json возвращается с перерывами

#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 последовательными запросами.