工作中遇到的问题--实现CustomerSetting的实时更新

首先在项目运行时就初始化CustomerSettings的值,采用@Bean,默认是singtone模式,只会加载一次。

@Configuration
@Order(3)
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MFGWebSecurityConfigurerAdapter extends
        AWebSecurityConfigurerAdapter {

@Autowired
    private UserRepository userRepository;

@Autowired
    private CustomerSettingsRepository customerSettingsRepository;

@Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                .formLogin()
                .successHandler(
                        new SavedRequestAwareAuthenticationSuccessHandler())
                .loginPage("/login").permitAll().failureUrl("/login-error")
                .defaultSuccessUrl("/").and().logout()
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                .logoutSuccessUrl("/logged-out").permitAll().and().rememberMe()
                .key(SECURITY_TOKEN)
                .tokenRepository(persistentTokenRepository())
                .tokenValiditySeconds(mfgSettings.getRememberMeTokenValidity())
                .and().sessionManagement().maximumSessions(1)
                .sessionRegistry(sessionRegistry).and().sessionFixation()
                .migrateSession().and().authorizeRequests().anyRequest()
                .authenticated();
    }

@Bean
    public PersistentTokenRepository persistentTokenRepository() {
        JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
        tokenRepository.setDataSource(dataSource);
        return tokenRepository;
    }

@Bean
    @LoggedInUser
    @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
    @Transactional(readOnly = true)
    public User getLoggedInUser() {
        Authentication authentication = SecurityContextHolder.getContext()
                .getAuthentication();
        if (authentication != null
                && !(authentication instanceof AnonymousAuthenticationToken)
                && authentication.isAuthenticated())
            return userRepository.findByLogin(authentication.getName());
        return null;
    }

@Bean
    @SystemUser
    @Scope(value = WebApplicationContext.SCOPE_APPLICATION, proxyMode = ScopedProxyMode.NO)
    @Transactional(readOnly = true)
    public User getSystemUser() {
        return userRepository.findByLogin(Constants.SYSTEM_USER);
    }

@Bean
    public CustomerSettings customerSettings() {
        return customerSettingsRepository.findAll().get(0);
    }
}
为了能够在CustomerSettings发生改变时,对相关的值进行实时更新,在CustomerService中添加更新后的操作方法:

@Override
    protected void afterUpdate(CustomerSettings t) {
        customerSettings.editFrom(t);
    }

@Override
    protected void afterEdit(CustomerSettings t) {
        customerSettings.editFrom(t);
    }

另外:enitForm方法是写在CustomerSettings.java这个实体类中的,这样在更新时就能实现对其中元素的部分更新,避免以前实训中有些元素没更新就会被置空,需要每次都先查询再手动部分更新的情况。

以下是这个实体中使用enitForm的案例:

package com.sim.mfg.data.domain;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.EntityListeners;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.MappedSuperclass;
import javax.persistence.Transient;
import javax.persistence.Version;

import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.sim.mfg.data.dto.Action;

/**
 * AMfgObject, based of all MFG data classes
 * @author system-in-motion
 *
 */
@MappedSuperclass
@EntityListeners({AuditingEntityListener.class})
public abstract class AMfgObject {
    
    @Version
    @Column(name = "VERSION")
    private int version;

@CreatedDate
    @Column(name = "CREATION_DATE", nullable = false)
    private Date creationDate;
    
    @LastModifiedDate
    @Column(name = "UPDATE_DATE")
    private Date updateDate;
    
    @JsonIgnore
    @CreatedBy
    @JoinColumn(name = "CREATED_BY", nullable = false)
    @ManyToOne(fetch = FetchType.LAZY)
    private User createdBy;
    
    @JsonIgnore
    @LastModifiedBy
    @JoinColumn(name = "UPDATED_BY")
    @ManyToOne(optional = true, fetch = FetchType.LAZY)
    private User updatedBy;
    
    @Column(name = "ENABLED", columnDefinition = "INT", nullable = false)
    private boolean enabled = true;
    
    @Transient
    private Set<Action> actions;

/**
     * Empty constructor
     */
    public AMfgObject() {}    
    /**
     * Override this method to provide object edition from another object
     * @param <T>
     * @param dto
     * @return
     */
    public abstract void editFrom(AMfgObject object);
    
    public int getVersion() {
        return version;
    }
    public void setVersion(int version) {
        this.version = version;
    }
    public Date getCreationDate() {
        return creationDate;
    }

public void setCreationDate(Date creationDate) {
        this.creationDate = creationDate;
    }

public Date getUpdateDate() {
        return updateDate;
    }

public void setUpdateDate(Date updateDate) {
        this.updateDate = updateDate;
    }

public User getCreatedBy() {
        return createdBy;
    }

public void setCreatedBy(User createdBy) {
        this.createdBy = createdBy;
    }

public User getUpdatedBy() {
        return updatedBy;
    }

public void setUpdatedBy(User updatedBy) {
        this.updatedBy = updatedBy;
    }

public boolean isEnabled() {
        return enabled;
    }

public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }
    
    @JsonProperty
    public Set<Action> getActions() {
        return actions;
    }

public void setActions(Set<Action> actions) {
        this.actions = actions;
    }
    
    /**
     * Return a list of arrays of action data to be displayed by DataTables
     * @return
     */
    public List<String[]> getActionArrays() {
        List<String[]> actionArrays = new ArrayList<String[]>();
        if (actions != null) {
            for (Action action : actions) {
                actionArrays.add(new String[] {
                        action.getBase(),
                        action.getAction(),
                        action.getStyle(),
                        action.getIcon(),
                        action.getAltText(),
                        action.getObjectId() == null ? "" : String.valueOf(action.getObjectId())});
            }
        }
        // Sort by base + action to make sure the order is the same on each row
        Collections.sort(actionArrays, new Comparator<String[]>() {
            private static final int BASE = 0;
            private static final int ACTION = 1;
            @Override
            public int compare(String[] arg0, String[] arg1) {
                return (arg0[BASE]+arg0[ACTION]).compareTo(arg1[BASE]+arg1[ACTION]);
            }
            
        });
        return actionArrays;
    }
    
}

package com.sim.mfg.data.domain;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.Where;
import org.hibernate.validator.constraints.NotBlank;

import com.sim.mfg.data.domain.type.DistributionOperationType;

@Entity
@Table(name = "CUSTOMERSETTINGS")
@Where(clause = "enabled=1")
public class CustomerSettings extends AMfgObject implements Serializable{

/**
     *
     */
    private static final long serialVersionUID = 559748589762162346L;
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    
    @NotBlank
    @Column(name = "NAME", nullable = false)
    private String name;

@Column(name = "PREFIXLOWER", nullable = false)
    private String prefixLower;

@Column(name = "PREFIXUPPER", nullable = false)
    private String prefixUpper;
    
    @Column(name = "CODEURL", nullable = false)
    private String codeUrl;

@Column(name = "BATCHEXPIRYTIMEOUT", nullable = false)
    private long batchExpiryTimeout;
    
    @Column(name = "PRODUCTIONDATEENABLED", nullable = false)
    private boolean productionDateEnabled = true;

@Column(name = "EXPIRYDATEENABLED", nullable = false)
    private boolean expiryDateEnabled = true;

@Column(name = "FILLLOCATIONWIDGETENABLED", nullable = false)
    private boolean fillLocationWidgetEnabled = true;

@Column(name = "PRODUCTSHELFLIFEENABLED", nullable = false)
    private boolean productShelfLifeEnabled = true;

@Column(name = "PRODUCTBARCODEENABLED", nullable = false)
    private boolean productBarcodeEnabled = true;

@Column(name = "WEIXINTOKEN", nullable = false)
    private String weixinToken;

@Column(name = "WEIXINCORPID", nullable = false)
    private String weixinCorpId;

@Column(name = "WEIXINENCODINGAESKEY", nullable = false)
    private String weixinEncodingAesKey;

@Column(name = "WEIXINCORPSECRET", nullable = false)
    private String weixinCorpSecret;

@Column(name = "WEIXINCODEAPPLICATIONAPPID", nullable = false)
    private Integer weixinCodeApplicationAppId;

@Column(name = "WEIXINSHIPMENTOPERATIONAPPID", nullable = false)
    private Integer weixinShipmentOperationAppId;

@Column(name = "WEIXINDELIVERYOPERATIONAPPID", nullable = false)
    private Integer weixinDeliveryOperationAppId;

@Column(name = "WEIXINRECEPTIONOPERATIONAPPID", nullable = false)
    private Integer weixinReceptionOperationAppId;

@Column(name = "WEIXINSIMPLERECEPTIONOPERATIONAPPID", nullable = false)
    private Integer weixinSimpleReceptionOperationAppId;

@Column(name = "WEIXINRETURNOPERATIONAPPID", nullable = false)
    private Integer weixinReturnOperationAppId;

@Column(name = "WEIXININVENTORYOPERATIONAPPID", nullable = false)
    private Integer weixinInventoryOperationAppId;

@Column(name = "WEIXINMOVEMENTOPERATIONAPPID", nullable = false)
    private Integer weixinMovementOperationAppId;

@Column(name = "WEIXINFILLINGOPERATIONAPPID", nullable = false)
    private Integer weixinFillingOperationAppId;
    /**
     * Empty constructor
     */
    public CustomerSettings() {    }
    
    /**
     * Get Weixin app id for given distribution operation type
     * @param operationType
     * @return
     */
    public Integer getWeixinDistributionOperationAppId(DistributionOperationType operationType) {
        switch (operationType) {
        case SHIPMENT:
            return weixinShipmentOperationAppId;
        case DELIVERY:
            return weixinDeliveryOperationAppId;
        case RECEPTION:
            return weixinReceptionOperationAppId;
        case RETURN:
            return weixinReturnOperationAppId;
        case INVENTORY:
            return weixinInventoryOperationAppId;
        case SIMPLERECEPTION:
            return weixinSimpleReceptionOperationAppId;
        default:
            return null;
        }
    }

public Long getId() {
        return id;
    }

public void setId(Long id) {
        this.id = id;
    }

public String getName() {
        return name;
    }

public void setName(String name) {
        this.name = name;
    }

public String getPrefixLower() {
        return prefixLower;
    }

public void setPrefixLower(String prefixLower) {
        this.prefixLower = prefixLower;
    }

public String getPrefixUpper() {
        return prefixUpper;
    }

public void setPrefixUpper(String prefixUpper) {
        this.prefixUpper = prefixUpper;
    }

public String getCodeUrl() {
        return codeUrl;
    }

public void setCodeUrl(String codeUrl) {
        this.codeUrl = codeUrl;
    }

public long getBatchExpiryTimeout() {
        return batchExpiryTimeout;
    }

public void setBatchExpiryTimeout(long batchExpiryTimeout) {
        this.batchExpiryTimeout = batchExpiryTimeout;
    }

public boolean isProductionDateEnabled() {
        return productionDateEnabled;
    }

public void setProductionDateEnabled(boolean productionDateEnabled) {
        this.productionDateEnabled = productionDateEnabled;
    }

public boolean isExpiryDateEnabled() {
        return expiryDateEnabled;
    }

public void setExpiryDateEnabled(boolean expiryDateEnabled) {
        this.expiryDateEnabled = expiryDateEnabled;
    }

public boolean isFillLocationWidgetEnabled() {
        return fillLocationWidgetEnabled;
    }

public void setFillLocationWidgetEnabled(boolean fillLocationWidgetEnabled) {
        this.fillLocationWidgetEnabled = fillLocationWidgetEnabled;
    }

public boolean isProductShelfLifeEnabled() {
        return productShelfLifeEnabled;
    }

public void setProductShelfLifeEnabled(boolean productShelfLifeEnabled) {
        this.productShelfLifeEnabled = productShelfLifeEnabled;
    }

public boolean isProductBarcodeEnabled() {
        return productBarcodeEnabled;
    }

public void setProductBarcodeEnabled(boolean productBarcodeEnabled) {
        this.productBarcodeEnabled = productBarcodeEnabled;
    }

public String getWeixinToken() {
        return weixinToken;
    }

public void setWeixinToken(String weixinToken) {
        this.weixinToken = weixinToken;
    }

public String getWeixinCorpId() {
        return weixinCorpId;
    }

public void setWeixinCorpId(String weixinCorpId) {
        this.weixinCorpId = weixinCorpId;
    }

public String getWeixinEncodingAesKey() {
        return weixinEncodingAesKey;
    }

public void setWeixinEncodingAesKey(String weixinEncodingAesKey) {
        this.weixinEncodingAesKey = weixinEncodingAesKey;
    }

public String getWeixinCorpSecret() {
        return weixinCorpSecret;
    }

public void setWeixinCorpSecret(String weixinCorpSecret) {
        this.weixinCorpSecret = weixinCorpSecret;
    }

public Integer getWeixinCodeApplicationAppId() {
        return weixinCodeApplicationAppId;
    }

public void setWeixinCodeApplicationAppId(Integer weixinCodeApplicationAppId) {
        this.weixinCodeApplicationAppId = weixinCodeApplicationAppId;
    }

public Integer getWeixinShipmentOperationAppId() {
        return weixinShipmentOperationAppId;
    }

public void setWeixinShipmentOperationAppId(Integer weixinShipmentOperationAppId) {
        this.weixinShipmentOperationAppId = weixinShipmentOperationAppId;
    }

public Integer getWeixinDeliveryOperationAppId() {
        return weixinDeliveryOperationAppId;
    }

public void setWeixinDeliveryOperationAppId(Integer weixinDeliveryOperationAppId) {
        this.weixinDeliveryOperationAppId = weixinDeliveryOperationAppId;
    }

public Integer getWeixinReceptionOperationAppId() {
        return weixinReceptionOperationAppId;
    }

public void setWeixinReceptionOperationAppId(
            Integer weixinReceptionOperationAppId) {
        this.weixinReceptionOperationAppId = weixinReceptionOperationAppId;
    }

public Integer getWeixinSimpleReceptionOperationAppId() {
        return weixinSimpleReceptionOperationAppId;
    }

public void setWeixinSimpleReceptionOperationAppId(
            Integer weixinSimpleReceptionOperationAppId) {
        this.weixinSimpleReceptionOperationAppId = weixinSimpleReceptionOperationAppId;
    }

public Integer getWeixinReturnOperationAppId() {
        return weixinReturnOperationAppId;
    }

public void setWeixinReturnOperationAppId(Integer weixinReturnOperationAppId) {
        this.weixinReturnOperationAppId = weixinReturnOperationAppId;
    }

public Integer getWeixinInventoryOperationAppId() {
        return weixinInventoryOperationAppId;
    }

public void setWeixinInventoryOperationAppId(
            Integer weixinInventoryOperationAppId) {
        this.weixinInventoryOperationAppId = weixinInventoryOperationAppId;
    }

public Integer getWeixinMovementOperationAppId() {
        return weixinMovementOperationAppId;
    }

public void setWeixinMovementOperationAppId(Integer weixinMovementOperationAppId) {
        this.weixinMovementOperationAppId = weixinMovementOperationAppId;
    }

public Integer getWeixinFillingOperationAppId() {
        return weixinFillingOperationAppId;
    }

public void setWeixinFillingOperationAppId(Integer weixinFillingOperationAppId) {
        this.weixinFillingOperationAppId = weixinFillingOperationAppId;
    }

@Override
    public void editFrom(AMfgObject object) {
        if(object==null)
            return ;
        CustomerSettings custSettings=(CustomerSettings)object;
        this.name=custSettings.getName();
        this.codeUrl=custSettings.getCodeUrl();
        this.batchExpiryTimeout=custSettings.getBatchExpiryTimeout();
        this.expiryDateEnabled=custSettings.isExpiryDateEnabled();
        this.fillLocationWidgetEnabled=custSettings.isFillLocationWidgetEnabled();
        this.prefixLower=custSettings.getPrefixLower();
        this.prefixUpper=custSettings.getPrefixUpper();
        this.productBarcodeEnabled=custSettings.isProductBarcodeEnabled();
        this.productionDateEnabled=custSettings.isProductionDateEnabled();
        this.productShelfLifeEnabled=custSettings.isProductShelfLifeEnabled();
        this.weixinCodeApplicationAppId=custSettings.getWeixinCodeApplicationAppId();
        this.weixinCorpId=custSettings.getWeixinCorpId();
        this.weixinCorpSecret=custSettings.getWeixinCorpSecret();
        this.weixinDeliveryOperationAppId=custSettings.getWeixinDeliveryOperationAppId();
        this.weixinEncodingAesKey=custSettings.getWeixinEncodingAesKey();
        this.weixinFillingOperationAppId=custSettings.getWeixinFillingOperationAppId();
        this.weixinInventoryOperationAppId=custSettings.getWeixinInventoryOperationAppId();
        this.weixinMovementOperationAppId=custSettings.getWeixinMovementOperationAppId();
        this.weixinReceptionOperationAppId=custSettings.getWeixinReceptionOperationAppId();
        this.weixinReturnOperationAppId=custSettings.getWeixinReturnOperationAppId();
        this.weixinShipmentOperationAppId=custSettings.getWeixinShipmentOperationAppId();
        this.weixinSimpleReceptionOperationAppId=custSettings.getWeixinSimpleReceptionOperationAppId();
        this.weixinToken=custSettings.getWeixinToken();
    }

@Override
    public String toString() {
        return "CustSettings [id=" + id + ", name=" + name + ", codeUrl="
                + codeUrl + "]";
    }
    
}

时间: 2024-10-11 21:03:57

工作中遇到的问题--实现CustomerSetting的实时更新的相关文章

Linux工作中常用到的一些命令(持续更新)常用的

1.查看运行级别3开启的服务列表:      chkconfig --list|grep 3:on 2.查找某类型的文件并计算总大小.       find / -name *.conf -exec wc -c {} \;|awk '{print $1}'|awk '{sum+=$1} END {print "sum=",sum}'       查找空文件:find / type f -size 0 -exec ls -l {} \; 3.使用dd命令快速生成大文件或者小文件的方法: 

生活工作中好用的快捷键和小工具(更新)

1.显示桌面快捷键: Win + D 作用:打开了很多窗口,需要回到桌面时使用.当然,也可以点击[显示桌面]的图表,但是其操作的爽快,远不如[Win+D]. 2.冻结屏幕输出快捷键: Ctrl + S 作用:串口数据一直输出,为了捕捉.分析数据,冻结屏幕,暂停输出. 冻结恢复: Ctrl + Q 3.随意截图快捷键: Ctrl + Shift + X 作用:任意截图.不过,其功能需要浏览器安装截图插件,并设置截图快捷键为这个组合. 4.启动Windows的[运行]操作框: Win + R 作用:

[工作中的设计模式]享元模式模式FlyWeight

一.模式解析 Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意.享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. 享元模式:主要为了在创建对象时,对共有对象以缓存的方式进行保存,对外部对象进行单独创建 模式要点: 1.享元模式中的对象分为两部分:共性部分和个性化部分,共性部分就是每个对象都一致的或者多个对象可以共享的部分,个性化部分指差异比较大,每个类均不同的部分 2.共性部分的抽象就是此模

openstack运维手册(个人实际工作中整理)

openstack运维手册,是本人在实际工作中整理的,现分享!!!因水平有限,欢迎广大朋友指正.具体文档见附件.

软件测试工程师工作中常用的Linux命令

Linux系统有着众多的优点,比方开源.非商业版本免费.多任务多用户操作,因而Linux系统在非桌面范畴占有压倒性的市场份额.关于互联网技术工作者来说,控制常用的Linux命令也是一门必修课.下面罗列一些笔者在工作中常用的Linux命令. cd 切换目录 cd .. 返回上一层目录 cd . 进入当前目录 cd - 返回前一次的目录,即上一次的目录不是上一层目录 ls 查看文件与目录 用法: ls [参数][文件] 参数: ls –l 显示文件的权限和属性 ls –a 列出所有的文件,包含隐藏文

[工作中的设计模式]解释器模式模式Interpreter

一.模式解析 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 以上是解释器模式的类图,事实上我很少附上类图,但解释器模式确实比较抽象,为了便于理解还是放了上来,此模式的要点是: 1.客户端提供一个文本.表达式或者其他,约定解析格式 2.针对文本中可以分为终结符表达式和非终结符表达式, 3.终结符表达式无需进一步解析,但仍需要转化为抽象接口的实例 4.针对非终结表达式,没一种标示需要定义一种解

[工作中的设计模式]策略模式stategy

一.模式解析 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 策略模式的关键点为: 1.多种算法存在 2.算法继承同样的接口,执行同样的行为,为可以替代的 3.算法调用者唯一,算法调用者可以灵活改变自己需要调用的算法,从而实现计算. 二.模式代码 算法接口: /** * 算法统一接口,所有算法继承此接口 * @author zjl * @time 2016-1-24 * */ public interface IStra

工作中请注意的十点

第一:不要认为停留在心灵的舒适区域内是可以原谅的. 每 个人都有一个舒适区域,在这个区域内是很自我的,不愿意被打扰,不愿意被push,不愿意和陌生的面孔交谈,不愿意被人指责,不愿意按照规定的时限做事, 不愿意主动的去关心别人,不愿意去思考别人还有什么没有想到.这在学生时代是很容易被理解的,有时候这样的同学还跟“冷酷”“个性”这些字眼沾边,算作是褒义.然而相反,在工作之后,你要极力改变这一现状.否则,你会很快变成鸡尾酒会上唯一没有人理睬的对象,或是很快因为压力而内分泌失调.但是,如果你能 很快打破

工作中的感悟 (三)三个月碎碎念篇

感慨一下来这里工作已经有一个月了,从最初的不是很适应这里的节奏,到慢慢适应了这里的生活,中间的过程就像经过一场暴风雨的洗礼虽然说的有点夸张,但是也是差不多吧,同在学校比要累很多,不过坚信不管再累.也要坚持既然有人有干,那我们就可以干我们没有什么理由坚持不了.别人可以做到的我们一样可以做到. 刚来的时候以一种无所谓.既兴奋又有很多好奇的心态来到了北京,这里很多人梦想的地方,不禁感慨以后我也在北京这里开始了这里的生活,时间长了究竟会是怎样一种心境呢,据说这里压力大.这里消费高.这里租房忒别烦人,来到