天天看點

spring boot踩的坑系列(一)

在做系統的時候,也是遇到了一些坑,開始不是很熟練,然後慢慢查找資料慢慢解決了,這裡将其列出來,以便以後可以繞開這些坑。

1、前端ajax、jQuery等問題

(1)在ajax與java後端傳遞資料的時候,傳遞給ajax的是一個data對象,ajax中調用對象中的屬性的時候,屬性名要一緻,調用對象的數組屬性的時候直接用data.num[i]的形式即可。主要是屬性名要一緻。

(2) 後端與ajax傳遞資料的時候,實體類的屬性名首字母最好小寫,這樣不容易出錯。

(3)ajax向後端傳遞參數的時候,在開始定義一個params,多個參數之間用逗号隔開。格式如下:

        var params={

         "num" : 1,//傳遞一個整數num,值為1

         "string ": "dsfs",//傳遞一個字元串,值為dafs

        };

(4)js中是無法使用Thymeleaf文法的,隻能使用HTML語言

在js中,如果要跳轉至某個頁面,直接href="" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" 或者連結src就行,不用th:href="" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" ,這樣的形式。使用href表示的是向後端傳遞資料,是以内容是控制端的名稱

(5)在使用webuploader插件進行檔案的上傳的時候,jQuery中設計到幾個變量,uploader方法是實行檔案的上傳的具體方法。其方法中涉及到一個swf,這是webupload插件的一個插件,先要下載下傳将其導入本項目中,然後在js裡面設定swf為該檔案的路徑。另外,還有一個server,這個應該是一個PHP方法,即調入背景控制端,類似于ajax的URL一樣,通過調入背景控制端将檔案儲存在項目中,或者儲存在伺服器中。

(6)控制端向js傳遞資料,可以現在後端将資料放在model中,然後在HTML中擷取,并将其隐藏,然後再在js中擷取其值。

HTML:<input type="hidden" th:value="${blogId}" id="Blog_ID"/>

js:var url_param = $("#Blog_ID").val();

(7)在js引用路徑的時候,src中是不需要開頭加一個/的,加不加效果都一樣

(8)檔案上傳至項目中指定檔案夾,但是檔案夾内的内容不是瞬間更新,是以,目前端ajax調用這些檔案的時候,是無法找到該檔案的,隻有當項目更新了檔案夾裡面有這些檔案的時候才可以擷取到。

(9)onclick出發事件的參數為this表示傳遞的參數為此标簽本身。如

<a class="fancybox" href="javascript:void(0);" target="_blank" rel="external nofollow" ><img οnclick="selectImgPath(this)" style="width: 190px; height: 115px;float:left;margin-right:3px;" alt="image" src="www.baidu.com" /></a>

然後傳遞的參數就可以通路src的内容。如傳遞的參數為msg,調用src為msg.src表示的就是www.baidu.com

(10)src和href的差別:src用于替換目前元素,href用于在目前文檔和引用資源之間确立聯系。

src是source的縮寫,指向外部資源的位置,指向的内容将會嵌入到文檔中目前标簽所在位置;在請求src資源時會将其指向的資源下載下傳并應用到文檔内,例如js腳本,img圖檔和frame等元素。如<script src ="js.js"></script>當浏覽器解析到該元素時,會暫停其他資源的下載下傳和處理,直到将該資源加載、編譯、執行完畢,圖檔和架構等元素也如此,類似于将所指向資源嵌入目前标簽内。這也是為什麼将js腳本放在底部而不是頭部。

href是Hypertext Reference的縮寫,指向網絡資源所在位置,建立和目前元素(錨點)或目前文檔(連結)之間的連結,如果我們在文檔中添加<link href="common.css" target="_blank" rel="external nofollow" rel="stylesheet"/>那麼浏覽器會識别該文檔為css檔案,就會并行下載下傳資源并且不會停止對目前文檔的處理。這也是為什麼建議使用link方式來加載css,而不是使用@import方式。

2、Jpa分頁的問題

(1) jpa進行分頁查詢的時候,按照某個屬性列來進行查詢的方法為;

        @Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1 ORDER BY ?#{#pageable}",countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",  nativeQuery = true)Page<User> findByLastname(String lastname, Pageable pageable);

(2) 在調用查詢所有進行分頁的時候,是可以直接調用jpa的findAll方法的,參數為pageable,但是這裡的以什麼為正序倒序和上面不同,上面的是表明,這裡的是對象的主鍵名,這裡的名稱要和對象中的屬性名要一緻,不然就會出現問題。也就是這裡要為blogid(對象中的主鍵名就為blogid)

(3)jpa根據某列查詢,并且查詢得到的結果集是根據某具體頁得到的結果

這種情況是和之前查詢所有的結果集是不一樣的,之前的是擷取所有的結果傳到表格中,表格中顯示規定大小的資料集,點選下一頁的時候自動顯示相關頁的資料。但是這裡穿的參數是具體的某頁,也就是說想要的傳回的結果集是根據某具體頁查詢得到的結果。這種情況下處理的代碼:

@Query(value="select * from blog  where status =?1 ",countQuery="select count(*) from blog where status=?1",nativeQuery=true)

public Page<Blog> getBlogsByStatusForList(int status,Pageable pageable);

與之前的差別是這裡沒有将pageable參數傳遞到query中去,這樣傳回的結果集就是根據某具體頁查詢得到的結果    

(4)在進行分頁查詢的時候,整個表的資料共有12條,查詢所有的時候不會出現異常,将全部的資料都設為同一狀态,即這種狀态共有12條資料,根據這種狀态進行查詢的時候,就會出現異常。但是将這種狀态的資料改為有9條的時候就不會出現異常。異常:java.lang.IllegalArgumentException: Could not locate ordinal parameter [2], expecting one of [1]

(5)jpa進行模糊比對,并且進行分頁查詢。

示例:

@Query(value="select * from blog  where status =?1 and key_word like CONCAT('%',?2,'%')",countQuery="select count(*) from blog where status=?1",nativeQuery=true)
   public Page<Blog> getBlogsByStatusForList(int status,String key_word,Pageable pageable);
           

(6)在将json的page格式的字元串格式的内容轉換為json對象,需要将page<>具體化,即建立一個對象實作page接口和Serializable接口。

(7)在使用jpa層的時候出現了Unknown column 'blogId' in 'order clause'錯誤,查詢了下,這是在使用分頁進行查詢的時候,順序是按照blogId進行排序的,不過這裡的查詢的是按照表中的blog_id這一列來進行倒序或者正序的。是以,這裡的在sort類的參數中應設定的值為:blog_id。源代碼如下:

    Sort sort=new Sort(Direction.ASC, "blog_id");

    Pageable pageable=new PageRequest(pageNumber-1, pageSize, sort);

4、spring boot架構的問題

(1)添加微服務的依賴的時候,需要注意spring  boot的版本和eureka的版本問題,spring boot的版本與eureka的版本是一一對應的,版本不對就會不相容,就會出現問題。為了使項目能夠支援比較新的技術,最好使用最新版的spring boot和eureka。版本對應關系:https://blog.csdn.net/russle/article/details/80865288。這裡給出依賴:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
        <relativePath/>
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <version>2.0.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
            <version>1.4.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.4.4.RELEASE</version>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.BUILD-SNAPSHOT</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/libs-snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
           

如果老的版本有些功能是不能支援的,比如spring boot1.x.x版本的就不支援jpa的分頁功能,是以最好使用最新版本的spring boot和eureka。

(2)spring boot在建立spring cloud支援的時候需要的spring boot2.0.0以上的版本   是以需要将預設的2.1版本的改為2.0.0以上的版本,而有些版本是有問題的,如果遇到版本更新pom檔案後依然出現問題,可以更改2.0.X的數字,例如,2、3、4等版本型号

(3)項目的熱部署依賴:

<dependency>			
			<groupId>org.springframework.boot</groupId>			
			<artifactId>spring-boot-devtools</artifactId>			
			<scope>true</scope>			
			<optional>true</optional> <!-- 這個需要為 true 熱部署才有效 -->
		</dependency>
		<plugin>				
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<configuration>					
				<fork>true</fork> <!-- 如果沒有該配置,devtools不會生效 -->
			</configuration>	
		</plugin>
           

(4)在兩個項目中的,一個項目讀取另一個項目中的圖檔資訊時,如果對象隻是儲存着該圖檔的相對位址,則在顯示的時候如果路徑僅僅是相對路徑,就會無法顯示路徑,因為在另一個項目中相對路徑是相對于本項目中的相對路徑。

(5)運用security後js css等靜态檔案預設是會被攔截的,解決方案:https://blog.csdn.net/malachi95/article/details/53641541

繼續閱讀