项目问题总结(一)

散落的棋子躺在沟壑纵横的棋盘上,正如乱世中的命运,不知何去何从。——莫问纷飞

Tomcat 启动报错too low setting for -Xss

问题描述:可以由于项目依赖的模块太多的缘故,导致每次启动的时候,就是第一次build完成以后没有问题,但是已经过启动,再次启动就会报错,刚开始报错就是Tomcat的启动类,启动不了,自己也就忍了一下,自己每次Build,但由于项目过大,忍不了,那就。。。。

Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies. The class hierarchy being processed was [org.bouncycastle.asn1.ASN1EncodableVector->org.bouncycastle.asn1.DEREncodableVector->org.bouncycastle.asn1.ASN1EncodableVe  
ctor]  

解决方法:

因为tomcat启动会去扫描jar包,看错误信息org.bouncycastle.asn1.ASN1EncodableVector,是出在这个类类似出现在bcprov*.jar这个包 所以在tomcatconf目录里面catalina.properties的文件, 在tomcat.util.scan.StandardJarScanFilter.jarsToSkip= 后面加上 bcprov*.jar 过滤 。

tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\
bootstrap.jar,commons-daemon.jar,tomcat-juli.jar,\
annotations-api.jar,el-api.jar,jsp-api.jar,servlet-api.jar,websocket-api.jar,\
jaspic-api.jar,\
catalina.jar,catalina-ant.jar,catalina-ha.jar,catalina-storeconfig.jar,\
catalina-tribes.jar,\
jasper.jar,jasper-el.jar,ecj-*.jar,\
tomcat-api.jar,tomcat-util.jar,tomcat-util-scan.jar,tomcat-coyote.jar,\
tomcat-dbcp.jar,tomcat-jni.jar,tomcat-websocket.jar,\
tomcat-i18n-en.jar,tomcat-i18n-es.jar,tomcat-i18n-fr.jar,tomcat-i18n-ja.jar,\
tomcat-juli-adapters.jar,catalina-jmx-remote.jar,catalina-ws.jar,\
tomcat-jdbc.jar,\
tools.jar,\
commons-beanutils*.jar,commons-codec*.jar,commons-collections*.jar,\
commons-dbcp*.jar,commons-digester*.jar,commons-fileupload*.jar,\
commons-httpclient*.jar,commons-io*.jar,commons-lang*.jar,commons-logging*.jar,\
commons-math*.jar,commons-pool*.jar,\
jstl.jar,taglibs-standard-spec-*.jar,\
geronimo-spec-jaxrpc*.jar,wsdl4j*.jar,\
ant.jar,ant-junit*.jar,aspectj*.jar,jmx.jar,h2*.jar,hibernate*.jar,httpclient*.jar,\
jmx-tools.jar,jta*.jar,log4j*.jar,mail*.jar,slf4j*.jar,\
xercesImpl.jar,xmlParserAPIs.jar,xml-apis.jar,\
junit.jar,junit-*.jar,hamcrest-*.jar,easymock-*.jar,cglib-*.jar,\
objenesis-*.jar,ant-launcher.jar,\
cobertura-*.jar,asm-*.jar,dom4j-*.jar,icu4j-*.jar,jaxen-*.jar,jdom-*.jar,\
jetty-*.jar,oro-*.jar,servlet-api-*.jar,tagsoup-*.jar,xmlParserAPIs-*.jar,\
xom-*.jar,\
bcprov*.jar

SLF4J: Class path contains multiple SLF4J bindings.

问题描述:系统模块太多,然后就是避免不了,Jar 包引入重复,冲突。

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Git/zeus-mall/zeus-web/target/zeus-web-0.0.1-SNAPSHOT/WEB-INF/lib/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Git/zeus-mall/zeus-web/target/zeus-web-0.0.1-SNAPSHOT/WEB-INF/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

解决方法:

  • 罗列 Maven 依赖,查询指定 Jar 对应的位置

1526606461510

修改对应的Maven依赖:

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
    </exclusions>
</dependency>

然后打包,启动项目。

Feign 调用传参有误

问题描述:

我在接口类传递了参数,但是在另一个微服务上显示,传递的参数为空。

解决办法:

  • 刚开始传参时,指定的方法是GET,但是在请求时报什么POST方法不支持,后来发现只要传递参数,即使你定义的GET方法请求,Feign依然会发送POST方法。
  • 还有就是传递参数时,要使用注解标注此参数

正确的写法:

写法一:

@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient {
    @RequestMapping(value = "/get", method = RequestMethod.GET)
    public User get1(@RequestParam("id") Long id, @RequestParam("username") String username);
}

这是最为直观的方式,URL有几个参数,Feign接口中的方法就有几个参数。使用@RequestParam注解指定请求的参数是什么。

写法二:

@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient {
    @RequestMapping(value = "/get", method = RequestMethod.GET)
    public User get2(@RequestParam Map<String, Object> map);
}

多参数的URL也可以使用Map去构建。当目标URL参数非常多的时候,可使用这种方式简化Feign接口的编写。

写法三:

服务方:

@RestController
public class UserController {
    @PostMapping("/post")
    public User post(@RequestBody User user) {
        ...
    }
}

调用方:

@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient {
    @RequestMapping(value = "/post", method = RequestMethod.POST)
    public User post(@RequestBody User user);
}

参考链接


文章作者: Asxing
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Asxing !
评论
 上一篇
微服务架构中内部服务之间调用随想 微服务架构中内部服务之间调用随想
命运如同一只不停旋转的陀螺,可以扭转它的,只有它自己!——莫问纷飞 对于内部服务需要考虑的问题: 区分暴露的接口和需要合法身份登录后才能访问的接口 暴露接口直接放行,转发到具体服务,如登录,刷新Token等 需要合法身份登录之后才能访问的
2018-05-21
下一篇 
Freemarker项目改造必备常识 Freemarker项目改造必备常识
一滴清泪洗去悲伤,南风吹过平原,滴血的花将如何盛开?——纵横剑圣 常用标签(有点乱,以备不时之需查找)Freemarker 的插值有如下两种类型: 1、通用插值: ${expr} 2、数字格式化插值:#{expr} 或者 {expr.for
2018-05-12
  目录