当前位置: 首页 > 知识库问答 >
问题:

Spring Boot:@Autow的记住并保存相同的对象也用于下一个请求

太叔志文
2023-03-14

我正在开发一个spring boot应用程序,下面是一个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(新的GetUserIdByUserNameOutput);

但在这里我创建了一个问题,因为我为每个新的API请求创建了一个新的“GetUserIdByUserNameOutput”实例,并且对系统来说效率不高且繁重...

如果我总结了我真正想知道的内容,我如何告诉@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个答案

严瑞
2023-03-14

在大多数情况下,春豆不应该有状态。bean是可重用的类的单个实例。不要使用setters!

而不是这样做:

getUserIdByUserNameBase。setGetUserIdByUserNameInput(GetUserIdByUserNameInput)

您需要在单个方法中进行计算,或者可能在bean中实例化一个新对象并返回新对象,例如。

return getUserIdByUserNameBase.getGetUserIdByUserName(GetUserIdByUserNameInput);

或者类似的

return getUserIdByUserNameBase.buildUsernameThing(GetUserIdByUserNameInput).execute();
 类似资料:
  • 背景:对于我的用户,我需要存储一对相同的对象类型(设置),目前我有它像 我正在创建带有设置的KeyValueTypes,并将其添加到列表中(每个用户都有一个列表)。我的设置有一个值字段(它显示了它们是否比其他设置“更重要”),所以我希望基于该字段添加它们,稍后我还需要基于该字段(可能还需要基于名称字段)进行搜索--所以搜索将不得不在列表中查找,然后在KeyValueTypes中查找 问题:什么是最

  • 当我保存以下实体时,它在另一个对象中复制相同的值: 例如,在我的struts项目(屏幕)中,如果我更改shipmentShipper字段的值,那么Shipment收货人也将使用相同的值进行更新。 实体: 仓库类: JSP中的字段映射(工作正常): 请检查屏幕截图,我将发货人更改为C4并保存。收货人也被选为C4。请注意,两个选择都使用相同的数据列表填充。(客户名单)

  • 本文向大家介绍两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?相关面试题,主要包含被问及两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?时的应答技巧和注意事项,需要的朋友参考一下 不对,两个对象的 hashCode() 相同,equals() 不一定 true。 代码示例: 执行的结果: str1:1179395 |

  • 问题内容: 我试图将数据库表保存在班级 学生* 的 ListArray 中。 * 在while循环中,当我尝试将数据打印为 它打印完美。但是当我尝试将其打印为 它打印从数据库读取的最后一条记录。记录数相同。如果在数据库表中保存了4行,那么显示的记录也将是4次。 我使用LIST的方式有问题吗?谢谢! 问题答案: 更改为 您是,因为您创建 了。您必须在数据库中添加等于。因此,创建如下。 使用

  • 我正在学习SpringJPA,我从将对象映射到表开始。我对OneToOne和OneToMany的关系没有问题,但我不太明白为什么我不能预先列出一个与许多关系相关的对象。我有一本可以有很多作者的书,还有一本可以有很多书的作者。通过中间表book_author正确生成模式(我可以在MySql Workbench中看到),但我得到以下示例: Hibernate:在作者(名字、姓氏)中插入值(?,) Hi

  • 我有这两个类,它们都有一个项目列表,我试图返回一个新对象“ItemWithDiscount”,它具有这两个类的属性,这在服务/控制器申请中。我尝试用流映射它们,但没能做到。谁能给我一个简单的方法来做这件事吗?