基本的操作和代碼編寫不多說了,網上一找一大把,主要記錄一下踩的坑,也算給自己留個印象。由于本人是在業余時間嘗試和學習,所以遇到的坑估計也都是很淺顯的問題。
Intellij IDEA使用的是社區版,免費的,相對功能也少很多,比如不能直接創建web項目。所以結果是在創建普通項目后,聯接tomcat來測試,通過maven來打包。
項目創建和設置都有段時間了,沒有記錄,都忘記了。但是當時還是遇到了一些坑的,想不起來了,也都不復雜,當時做到有servlet就放下了。
近期又拿起來,是為了增加Restful風格的接口。從網上找了找說是Jersey很好用,于是嘗試使用Jersey。
因為沒有Java的實際工程經驗,都是自己摸索的(本職C++),所以就算對Java本身的語法、更基礎的算法和數據模型沒什么不理解的,關鍵的問題出在了項目結構、構建以及一些輔助工具的使用上,這里的坑都踩在了maven上(同樣的,對于ant或者grandle也沒有使用經驗,一點借鑒都沒有)。
實際上只要在自動生成的pom.xml文件里添加正確的Jersey依賴就可以了,讓maven把必要的文件下載下來就可以使用;不過我走了不少彎路,具體來說有:
1、自己下了一個Jersey的lib包。開始時引入了這個比較大的包去開發,到后來發現這個包直接可以刪除,因為只要依賴正確,maven會下載所需的包,不需要完整的包。
2、能夠運行,但是打包成war以后部署在tomcat里不能使用。這里開始是犯了一個低級錯誤,把source文件夾設置給取消掉了,所以沒有生成對應的class;后來發現在Intellij IDEA里,如果先用maven的clean再用maven的package命令,打包出來還是沒有class文件。似乎只有測試運行一次,才能正確打包,不知道是我設置的問題還是IDE的問題。
3、找不到Jersey的servlet。這個就是沒有正確添加依賴(因為我沒有使用spring或者struct2框架,所以引入 的注入是jersey-hk2,應該要根據實際框架調整):
4、后來使用POJO方式直接向前端返回JSON數據,也就是Jersey框架要完成一個將POJO直接轉換為JSON的功能,這時如果沒有設置依賴會報500錯誤,tomcat控制臺打印出的問題是(class名自定):
org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo MessageBodyWriter not found for media type=application/json, type=class servlet.usingJersey$tmpClass, genericType=class servlet.usingJersey$tmpClass
究其原因,是下面這個引用:
5、所有的依賴要有正確的版本設置。另外前面列出的是最新的Jersey版本,以前似乎還有其它前綴的版本,不是org.glassfish.jersey.xxx的,找資料時要注意。
6、這個和Jersey無關,是前端ajax請求restful接口的小坑:如果設置ajax請求的contentType為"application/json",返回的值必須是標準的JSON,否則會走到請求設置的error函數,而不是success函數。另外在success里,函數接到的參數已經是JSON對象了,不需要再做parse動作。
以上把基礎的坑都踩到了,能夠成功部署一個Jersey的Restful風格的服務。接下來就是具體的業務實現了。