• 问题总结


    1. FastJson 泛型转换踩坑,缓存问题 : http://blog.csdn.net/ykdsg/article/details/50432494

    2. Spring中properties配置文件参数读取问题,Spring 父子容器,参见:http://blog.csdn.net/fouy_yun/article/details/48437505      https://www.cnblogs.com/hafiz/p/5875740.html

        AOP扫描也需要注意 父子容器问题,另外,要启用AspectJ对Annotation的支持:<aop:aspectj-autoproxy/>   

    3. jar找不到:双击tomcat看配置文件,Server Location中通过 Server path 可以查看eclipse中临时项目位置(tomcat部署的实际项目)

    4. tomcat启动项目,一直找不到某些jar:可能是缓存问题,mvn clean package 清除缓存,成功重新打包试试

    5. 引入mvn仓库没有的jar包,首先将jar包拷贝到lib目录下,然后pom.xml配置:    

    <dependency>
            <groupId>com.tencent.xinge</groupId>
            <artifactId>PushJavaSDK</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/PushJavaSDK.jar</systemPath>
      </dependency>
    
      <!-- 打war包时,将jar包拷贝进去 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <webResources>
                    <resource>
                        <directory>${project.basedir}/../erp-service/lib</directory>
                        <targetPath>WEB-INF/lib</targetPath>
                        <filtering>false</filtering>
                        <includes>
                            <include>**/*.jar</include>
                        </includes>
                    </resource>
                </webResources>
            </configuration>
            <version>2.1.1</version>
        </plugin>
    View Code

     6. 分布式锁:     

            String lockKey = LockConstants.LOCK_KEY_ACTIVE_LEAGUE_PREFIX + activateCarUnionDTO.getDealerId();
            if (!redissonLockService.tryLock(lockKey)) {
                return RespMsg.fail("重复请求");
                //直接返回
            }
    
    
    
    @Slf4j
    @Service("redissonLockService")
    public class RedissonLockServiceImpl implements LockService {
    
        @Autowired
        @Qualifier("redisson")
        private RedissonClient redisson;
    
        @Override
        public boolean tryLock(String key) {
            return tryLock(key, 0L, TimeUnit.SECONDS);
        }
    
        @Override
        public boolean tryLock(String key, long timeout, TimeUnit unit) {
           return tryLock(key,timeout, LockService.DEFAULT_EXPIRE_TIME,unit);
        }
    
        @Override
        public boolean tryLock(String key,long waitTime, long leaseTime, TimeUnit unit) {
            try {
                RLock lock = redisson.getLock(key);
                boolean res = lock.tryLock(waitTime, leaseTime, unit);
                return res;
            } catch (InterruptedException e) {
                RedissonLockServiceImpl.log.error("获取redis锁异常, key is {}, timeout is {},leaseTime is {}, unit is {}.", key, waitTime,leaseTime, unit,
                        e);
                throw new LockException(RespStatusEnum.FAIL,"缓存锁定失败");
            }
        }
    
        @Override
        public void lock(String key) {
            RLock lock = redisson.getLock(key);
            lock.lock();
        }
    
        @Override
        public void unLock(String key) {
            RLock lock = redisson.getLock(key);
            lock.unlock();
        }
    
    }
    View Code

     7. 校验返回值工具类:

    public class RespUtils {
    
        private static Logger logger= LoggerFactory.getLogger(RespUtils.class);
    
        public  static <T>T resultWithCheck(RespDTO<T> respDTO, String serviceName) throws ServiceException {
            if (respDTO.getStatus() != RespStatusEnum.SUCCESS.getStatus()) {
                logger.error("调用{}服务异常,返回结果,status:{},msg:{}",serviceName, respDTO.getStatus(), respDTO.getMsg());
                throw new ServiceException(respDTO.getMsg());
            }
            return respDTO.getData();
        }
    
    
        public  static <T>T resultWithCheck(RespMsg<T> respDTO, String serviceName) throws ServiceException {
            if (respDTO.getStatus() != RespStatusEnum.SUCCESS.getStatus()) {
                logger.error("调用{}服务异常,返回结果,status:{},msg:{}",serviceName, respDTO.getStatus(), respDTO.getMsg());
                throw new ServiceException(respDTO.getMsg());
            }
            return respDTO.getData();
        }
    
        public  static <T>T resultWithCheck(RespMsg<T> respDTO, String serviceName, String callMethod) throws ServiceException {
            if (respDTO.getStatus() != RespStatusEnum.SUCCESS.getStatus()) {
                logger.error("调用{}服务异常,返回结, callMethod:{}, status:{},msg:{}",serviceName, callMethod, respDTO.getStatus(), respDTO.getMsg());
                throw new ServiceException(respDTO.getMsg());
            }
            return respDTO.getData();
        }
        
        public static <T>T  resultWithCheck(com.mljr.car.league.common.dto.RespDTO<T> respDTO, String serviceName) throws ServiceException {
            if (respDTO.getRc() != RespCodeEnum.SUCCESS.getStatus()) {
                logger.error("调用{}服务异常,返回结果,status:{},msg:{}",serviceName, respDTO.getRc(), respDTO.getMsg());
                throw new ServiceException(respDTO.getMsg());
            }
            return respDTO.getData();
        }
    }
    View Code

     8. 数据库字段设置唯一索引,如果继续插入重复数据,可能导致异常。这种异常需要明确提示“数据重复”。可以通过判断异常名称,来确定返回信息。

    catch(Exception e){
                String local = e.getMessage();
                logger.info("local{}"+local);
                String localizeMsg = e.getLocalizedMessage();
                logger.info("localizeMsg{}"+localizeMsg);
                if(localizeMsg.contains("MySQLIntegrityConstraintViolationException")){
                    return RespMsg.fail("车商门店重复,无法添加");
                }
                
                logger.error(msg,e);
            }
    View Code

     9. 泛型     

    // 成员变量泛型在 类上声明?  
    // 方法参数泛型,在方法上声明?
    @Data
    public class RespMsg<T,V> {
        private String msg;
        private int status;
        private  T   data;
        private  V   data2;
    
        public RespMsg(String msg,int status,T data){
             this.msg = msg;
             this.status = status;
             this.data = data;
        }
    
    
        public <T,E> void test(T data,E date){
        }
    }
    View Code

    10. Stream用法: (https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/):

          List<String> output = wordList.stream().map(String::toUpperCase).collect(Collectors.toList());

    11. Spring自动注入properties文件:http://1358440610-qq-com.iteye.com/blog/2090955

    12. Java 8:通过反射获取参数名:在Java 8中,使用javac编译器的时候加上-parameters参数的话,会在生成的.class文件中额外存储参数的元信息。当你输入javac -help的时候,你会看到-parameters这个选项

          参见:http://deepinmind.iteye.com/blog/2046050

       

  • 相关阅读:
    随 机 贪 心
    QWidget,QMainWindow和QDialog的区别
    粒子系统和Ogre 3D扩展 -----OGRE 3D 1.7 Beginner‘s Guide中文版 第十章(终章)
    setStyleSheet 设置多个属性
    Ogre 3D的启动顺序 -----OGRE 3D 1.7 Beginner‘s Guide中文版 第九章
    合成器框架 -----OGRE 3D 1.7 Beginner‘s Guide中文版 第八章
    Ogre 3D与材质 -----OGRE 3D 1.7 Beginner‘s Guide中文版 第七章
    场景管理器 -----OGRE 3D 1.7 Beginner‘s Guide中文版 第六章
    使用Ogre 3D 运动模型 -----OGRE 3D 1.7 Beginner‘s Guide中文版 第五章
    摄像机,光源和阴影 -----OGRE 3D 1.7 Beginner‘s Guide中文版 第四章
  • 原文地址:https://www.cnblogs.com/Jtianlin/p/8259014.html
Copyright © 2020-2023  润新知