Spring Boot: @Autowired запомнить и сохранить тот же объект также для следующего запроса - PullRequest
0 голосов
/ 30 августа 2018

Я разрабатываю приложение с загрузочной пружиной, например, под одним API:

@Autowired
GetUserIdByUserNameBase getUserIdByUserNameBase;

@PostMapping(value = "/UserName")
    public GetUserIdByUserNameOutput getUserIdByUserName(@RequestBody String userName) {
        GetUserIdByUserNameInput GetUserIdByUserNameInput = new GetUserIdByUserNameInput(userName);
    getUserIdByUserNameBase.setGetUserIdByUserNameInput(GetUserIdByUserNameInput);
    MsgStatus msgStatus = getUserIdByUserNameBase.execute();
    if (msgStatus == MsgStatus.ERROR_MSG) {
        LOG.error("UserRestController,getUserIdByUserName : Internal System Error");
    }
    return getUserIdByUserNameBase.getGetUserIdByUserNameOutput();
}

Моя проблема появляется во втором / следующем запросе с тем же API (например, выше) «GetUserIdByUserNameBase» по-прежнему запоминает все сохраненные данные из Первый удар!.

public class GetUserIdByUserNameBase extends ServiceBase {

    private final Logger LOG = LogManager.getLogger(GetUserIdByUserNameBase.class);
    private GetUserIdByUserNameInput getUserIdByUserNameInput;
    private GetUserIdByUserNameOutput getUserIdByUserNameOutput;
    private ResultStatus resultStatus;
    private String userName;
    private TBUSER_INFO userInfo;

Здесь, в моем случае, "getUserIdByUserNameOutput" все еще сохраняет предыдущий данные от первого попадания API до тех пор, пока я не переопределю содержимое или не отмечу его как пустой.

1. GetUserIdByUserNameBase.setGetUserIdByUserNameOutput (new GetUserIdByUserNameOutput);

или

  1. GetUserIdByUserNameBase.getGetUserIdByUserNameOutput () Setx (NULL);.

но здесь я создаю одну проблему, так как я создал новый экземпляр «GetUserIdByUserNameOutput» для каждого нового запроса API и не является эффективным и тяжелым для системы ...

Если я подведу итог, что я действительно хочу знать, как я могу сказать @Autowired отказов / отдыха объекта при каждом новом запросе API и не использовать или переопределять то, что он помнит из первого запроса .?

Вот мой полный код:

package com.usermanagementms.ims.servicesfacade.userservices;

import javax.transaction.Transactional;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.usermanagementms.ims.enums.MsgStatus;
import com.usermanagementms.ims.repositories.userdao.TBUserInfoDao;
import com.usermanagementms.ims.tables.user.TBUSER_INFO;
import com.usermanagementms.ims.types.commontypes.ResultStatus;
import com.usermanagementms.ims.types.getuseridbyusername.GetUserIdByUserNameInput;
import com.usermanagementms.ims.types.getuseridbyusername.GetUserIdByUserNameOutput;
import com.usermanagementms.ims.utils.ErrorMsg;
import com.usermanagementms.ims.utils.ErrorsController;
import com.usermanagementms.ims.utils.Utils;

@Service
public class GetUserIdByUserNameBase extends ServiceBase {

    private final Logger LOG = LogManager.getLogger(GetUserIdByUserNameBase.class);
    private GetUserIdByUserNameInput getUserIdByUserNameInput;
    private GetUserIdByUserNameOutput getUserIdByUserNameOutput;
    private ResultStatus resultStatus;
    private String userName;
        private TBUSER_INFO userInfo;

        @Autowired
        private TBUserInfoDao TBUserInfoDao;

        @Autowired
        private ErrorsController errorsController;

        @Transactional
        public TBUSER_INFO getUserIdByUserName(String username) {

            TBUSER_INFO userInfo;
            try {
                userInfo = TBUserInfoDao.findIdByUserName(username);
                if (userInfo == null) {
                    LOG.warn("UserService,getUserIdByUserName : userInfo is empty");
                    return null;
                }
                return userInfo;
            } catch (Exception e) {
                LOG.error("UserService,getUserIdByUserName : error in retrieving user from DB { " + e.getMessage() + "}");
            }
            return null;
        }

        @Override
        public MsgStatus inputMapping() {
            MsgStatus msgStatus = MsgStatus.SUCCESS_MSG;
            this.setGetUserIdByUserNameOutput(new GetUserIdByUserNameOutput());
            if (getResultStatus() == null) {
                this.setResultStatus(new ResultStatus());
            }
            msgStatus = super.inputMapping();
            if (msgStatus == MsgStatus.ERROR_MSG || this.getUserIdByUserNameInput == null) {
                LOG.error("GetUserIdByUserNameBase,inpuMapping() : Internal System Error");
                this.getErrorsController().fillResultStatus(ErrorMsg.SYSTEM_ERROR, this.resultStatus);
                this.getGetUserIdByUserNameOutput().setResultStatus(resultStatus);
                return MsgStatus.ERROR_MSG;
            }
            this.setUserName(getUserIdByUserNameInput.getUserNameX1());
            return MsgStatus.SUCCESS_MSG;
        }

        @Override
        public MsgStatus validate() {
            if (Utils.isNullorEmpty(userName)) {
                LOG.error("GetUserIdByUserNameBase,validate() : userName is null or empty");
                this.getErrorsController().fillResultStatus(ErrorMsg.REQUEST_BODY_EMPTY, this.resultStatus);
                this.getGetUserIdByUserNameOutput().setResultStatus(resultStatus);
                return MsgStatus.ERROR_MSG;
            }
            return MsgStatus.SUCCESS_MSG;
        }

        @Override
        public MsgStatus executeImpl() {
            MsgStatus msgStatus = MsgStatus.SUCCESS_MSG;
            TBUSER_INFO userInfo = getUserIdByUserName(userName);
            this.setUserInfo(userInfo);
            if (userInfo == null) {
                msgStatus = this.getErrorsController().fillResultStatus(ErrorMsg.USER_NOT_FOUND, resultStatus);
                if (msgStatus == MsgStatus.ERROR_MSG) {
                    this.getErrorsController().fillResultStatus(ErrorMsg.SYSTEM_ERROR, resultStatus);
                    this.getGetUserIdByUserNameOutput().setResultStatus(resultStatus);
                    LOG.error("GetUserIdByUserNameBase,executeImpl() : Internal System Error");
                    return MsgStatus.ERROR_MSG;
                }
                this.getGetUserIdByUserNameOutput().setResultStatus(resultStatus);
                return MsgStatus.ERROR_MSG;
            }
            this.getErrorsController().fillResultStatus(ErrorMsg.OK, resultStatus);
            this.getGetUserIdByUserNameOutput().setResultStatus(resultStatus);
            return MsgStatus.SUCCESS_MSG;
        }

        @Override
        public MsgStatus outputMapping() {
            this.getGetUserIdByUserNameOutput().setUserId(this.getUserInfo().getUid());
            return MsgStatus.SUCCESS_MSG;
        }

        public GetUserIdByUserNameInput getGetUserIdByUserNameInput() {
            return getUserIdByUserNameInput;
        }

        public void setGetUserIdByUserNameInput(GetUserIdByUserNameInput getUserIdByUserNameInput) {
            this.getUserIdByUserNameInput = getUserIdByUserNameInput;
        }

        public GetUserIdByUserNameOutput getGetUserIdByUserNameOutput() {
            return getUserIdByUserNameOutput;
        }

        public void setGetUserIdByUserNameOutput(GetUserIdByUserNameOutput getUserIdByUserNameOutput) {
            this.getUserIdByUserNameOutput = getUserIdByUserNameOutput;
        }

        public String getUserName() {
            return userName;
        }

        public void setUserName(String userName) {
            this.userName = userName;
        }

        public ErrorsController getErrorsController() {
            return errorsController;
        }

        public void setErrorsController(ErrorsController errorsController) {
            this.errorsController = errorsController;
        }

        public ResultStatus getResultStatus() {
            return resultStatus;
        }

        public void setResultStatus(ResultStatus resultStatus) {
            this.resultStatus = resultStatus;
        }

        public TBUSER_INFO getUserInfo() {
            return userInfo;
        }

        public void setUserInfo(TBUSER_INFO userInfo) {
            this.userInfo = userInfo;
        }
    }

public class GetUserIdByUserNameOutput {

    private Long UserId;
    private ResultStatus resultStatus;

    public GetUserIdByUserNameOutput() {

    }

    public GetUserIdByUserNameOutput(Long userId, ResultStatus resultStatus) {
        super();
        UserId = userId;
        this.resultStatus = resultStatus;
    }

    public GetUserIdByUserNameOutput(ResultStatus resultStatus) {
        this.resultStatus = resultStatus;
    }

    public Long getUserId() {
        return UserId;
    }

    public void setUserId(Long userId) {
        UserId = userId;
    }

    public ResultStatus getResultStatus() {
        return resultStatus;
    }

    public void setResultStatus(ResultStatus resultStatus) {
        this.resultStatus = resultStatus;
    }
}

Если вы посмотрите на этот метод:

public MsgStatus inputMapping() {
            MsgStatus msgStatus = MsgStatus.SUCCESS_MSG;
            this.setGetUserIdByUserNameOutput(new GetUserIdByUserNameOutput());

Я начинаю создавать "new GetUserIdByUserNameOutput ()" все время с каждым запросом на один и тот же API !! и я думаю, что это не эффективно и тяжело для системы для создания большого количества экземпляров GetUserIdByUserNameOutput через несколько раз ...

1 Ответ

0 голосов
/ 30 августа 2018

Весенние бобы в большинстве случаев не должны иметь состояния. Бин - это единственный экземпляр класса, который используется повторно. Не используйте сеттеры!

Вместо этого:

getUserIdByUserNameBase.setGetUserIdByUserNameInput(GetUserIdByUserNameInput);

Вы должны выполнить вычисления в одном методе или, возможно, создать новый объект внутри компонента и вернуть новый объект, например,

return getUserIdByUserNameBase.getGetUserIdByUserName(GetUserIdByUserNameInput);

или что-то вроде

return getUserIdByUserNameBase.buildUsernameThing(GetUserIdByUserNameInput).execute();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...