【Java总结】记一次诡异的Reques method 'POST' not supported

版权声明:作者写博是为了总结经验,和交流学习之用。 如需转载,请在文章页面明显位置给出原文连接。谢谢!如有问题,请留言! https://blog.csdn.net/changqing5818/article/details/86502526

问题说明

本地开发测试,系统运行一切正常,但是系统打包部署到服务器之后,
浏览器控制台(Console)报错:
405 Method not allowed
后台日志报错:

org.springframework.web.servlet.PageNotFound - Request 'POST' not supported

解决路线

路线一:打包错误

从本地重新打包,放在服务器上运行,问题仍然存在,该路线不通;

-- 强制更新依赖
mvn clean package -Dmaven.test.skip=true -e -U

使用-U参数: 该参数能强制让Maven检查所有SNAPSHOT依赖更新,确保集成基于最新的状态,如果没有该参数,Maven默认以天为单位检查更新,而持续集成的频率应该比这高很多。
**使用-e参数:**如果构建出现异常,该参数能让Maven打印完整的stack trace,以方便分析错误原因。

路线二:Jar包冲突

1)通过工程中POM依赖树查看是否存在相同依赖,不通版本的jar包,不存在;
2)删除本地已存在的依赖包,重新从Maven私服拉取;
3)从服务器上查看是否存在tomcat-*.jar以及servlet*.jar不存在;

上述三种方式做过后,再次打包测试,该路线不通

知识点:Maven Scope作用域:

1、test范围指的是测试范围有效,在编译和打包时都不会使用这个依赖
2、compile范围指的是编译范围有效,在编译和打包时都会将依赖存储进去
3、provided依赖:在编译和测试的过程有效,最后生成war包时不会加入
4、runtime在运行的时候依赖,在编译的时候不依赖
默认的依赖范围是compile

诸如:Junit、Powermock等之类的作用域应是testservlet-api以及tomcat-jul之类的作用域是provided,因为servlet-apitomcat等web服务器已经存在了,如果再打包有可能会冲突。

路线三:运行环境与开发环境不一致

本地开发环境,JDK版本是1.8,运行环境JDK版本是1.7,将服务器上的JDK版本升级后发现查询功能可用但是导出功能不可用,问题便清晰了:
1)确认工程中配置的JDK编译版本是1.7,本地工程无问题;
2)最近的一次改动变动引入了一个新的jar包:ngtool
3)修改ngtool工程中的jdk编译版本,由1.8修改为1.7

<plugins>
	<!-- 指定jdk --> 
	<plugin> 
		<groupId>org.apache.maven.plugins</groupId> 
		<artifactId>maven-compiler-plugin</artifactId> 
		<configuration> 
			<source>1.7</source> 
			<target>1.7</target> 
		</configuration> 
	</plugin> 
</plugins>

修改后重新编译发布:

mvn clean deploy -e -U

问题反思

  1. 本地开发环境下属于调试,运行正常后应在仿真环境下测试,保证一次编译,到处运行
  2. 规范开发流程,开发环境与运行环境保持统一,减少类似上述这种低级问题的出现;

我是如何解决问题的

1.开启eclipse远程调试

1)在服务器上的进程启动参数中添加:

[test@localhost ~]$ cd $TOMCAT_HOME/bin
[test@localhost bin]$ vi catalina.sh

添加参数:

JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=6666,server=y,suspend=n"

2)启动Tomcat服务,查看服务端端口号状态,Telnet检查端口的连通性

3)调试客户端设置

选择Debug -> 设置 Debug configurations --> Remote Java Application
在这里插入图片描述

输入Name -> 选择Project -> 输入Host地址 -> 输入上述设置的Port -> 点击Debug

打开应用,点击功能,和本地开发调试一样的操作,不多赘述。

额外释义:

-Xdebug是通知JVM工作在DEBUG模式下,
-Xrunjdwp是通知JVM使用(Java debug wire protocol)来运行调试环境。该参数同时了一系列的调试选项:

   transport指定了调试数据的传送方式
   dt_socket            是指用SOCKET模式
   server=y/n            VM 是否需要作为调试服务器执行。
   suspend=y/n           是否在调试客户端建立连接之后启动 VM 

2. 打包工具统一:xxx_package.bat

@echo off

set JAVA_HOME=D:\java7\jdk1.7.0
set MAVEN_HOME=D:\maven3.3.3
set CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
set PATH=%JAVA_HOME%\bin;%JAVA_HOME%\jar\bin;%MAVEN_HOME%\bin

java -version

call mvn clean package -Dmaven.test.skip=true -e -U
pause

就一个想法,无论你本地有多少个JDK版本,一个项目组内统一使用同一个版本进行打包测试!

猜你喜欢

转载自blog.csdn.net/changqing5818/article/details/86502526