spring boot 採坑

2019年2月19日19:25:42java

 版本 2.1.3.RELEASEmysql

1,本地開發須要加依賴庫,保存實時熱更新ajax

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>

 配置是否開啓spring

spring.devtools.add-properties=false

 

 

2,eclipse 格式化代碼熱鍵衝突,熱鍵是ctrl+shift+f 若是使用搜狗輸入法,在配置裏面取消掉sql

 

3,java代碼提示,Window ——> Preferences ——> Java ——> Editor ——> Content Assist 數據庫

[auto activation triggers for java]自動補全觸發器,默認是".", 這個位置能夠設置成26個字母外加'.':.abcdefghijklmnopqrstuvwxyz(不區分大小寫)json

[auto activation triggers for javadoc]javadoc的觸發器,默認是"@#".windows

 

4,@Controller 和 @RestControllerapi

@Controller 在使用模板的時候使用返回 是這個請求安全

若是隻返回body數據在方法加上 @ResponseBody 

若是隻返回body數據就直接加上@RestController 註解

 

5,Loading class `com.mysql.jdbc.Driver'. This is deprecated.注意spring boot的版本

application.properties 修改

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

 

6,關於業務分層

     @Service用於標註業務層組件,

     @Controller用於標註控制層組件(如struts中的action),

     @Repository用於標註數據訪問組件,即DAO組件,

     @Component泛指組件,當組件很差歸類的時候,咱們可使用這個註解進行標註

 

 7,開發手冊 ghost win10缺乏hh.exe

最簡單的方式就是其餘原裝系統中複製hh.exe(windows目錄),hhctrl.ocx,itss.dll,itircl.dll(windows/system32目錄)。

1.將裏面的hh.exe文件放置電腦 C:\Windows目錄下;
2.將 hhctrl.ocx ,itss.dll ,itircl.dll三個文件放置 C:\Windows\System32 目錄下;
3.以管理員方式打開cmd,輸入:
4.regsvr32 hhctrl.ocx
5.regsvr32 itss.dll
6regsvr32 itircl.dll 提示成功便可

 

8,根據表生產表模型

網頁工具:http://java.bejson.com/generator/

eclipse 自帶工具jpa工具 mybatis也有相似工具

jpa工具添加

https://blog.csdn.net/xwnxwn/article/details/53304153

https://blog.csdn.net/abc997995674/article/details/80227396

建議使用jpa tools

 

9,freemarker 配置

 

10,設置eclipse設置IDE編碼

https://blog.csdn.net/qq_20936333/article/details/81322007

 

11, @getMapping與@postMapping  @RequestMapping

@getMapping與@postMapping
首先要了解一下@RequestMapping註解。

  @RequestMapping用於映射url到控制器類的一個特定處理程序方法。可用於方法或者類上面。也就是能夠經過url找到對應的方法。

  @RequestMapping有8個屬性。

value:指定請求的實際地址。

method:指定請求的method類型(GET,POST,PUT,DELETE)等。

consumes:指定處理請求的提交內容類型(Context-Type)。

produces:指定返回的內容類型,還能夠設置返回值的字符編碼。

params:指定request中必須包含某些參數值,才讓該方法處理。

headers:指定request中必須包含某些指定的header值,才讓該方法處理請求。

 

@getMapping與@postMapping是組合註解。

@getMapping = @requestMapping(method = RequestMethod.GET)。

@postMapping = @requestMapping(method = RequestMethod.POST)。

 12,api返回restful風格的json數據格式,建議直接使用map作數據返回不用寫 RequestMapping的一些參數

 

public class ResponseHelper {

    public static Map<String, Object> responseData(int code, String message, Object data) {
        Map<String, Object> objects = new HashMap<String, Object>();
        objects.put("code", code);
        objects.put("message", message);
        objects.put("data", data);
        return objects;
    }

    public static Map<String, Object> responseMessage(int code, String message) {
        Map<String, Object> objects = new HashMap<String, Object>();
        objects.put("code", code);
        objects.put("message", message);
        return objects;
    }

}

使用@RestController 註解,配置

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=Asia/Shanghai

 

13,關於數據存儲時間和數據庫返回時間不一致好比相差13,14個小時,是由於mysql的配置時區致使的

通常直接設置默認時區加8個小時就oK

[mysqld]

default-time-zone='+8:00'

 

14,數據庫主鍵生成策略

@GeneratedValue(strategy=GenerationType.AUTO)

@GeneratedValue: 
@GeneratedValue 用於標註主鍵的生成策略,經過strategy 屬性指定。默認狀況下,JPA 自動選擇一個最適合底層數據庫的主鍵生成策略:SqlServer對應identity,MySQL 對應 auto increment。 
在javax.persistence.GenerationType中定義瞭如下幾種可供選擇的策略: 
–IDENTITY:採用數據庫ID自增加的方式來自增主鍵字段,Oracle 不支持這種方式; 
–AUTO: JPA自動選擇合適的策略,是默認選項; 
–SEQUENCE:經過序列產生主鍵,經過@SequenceGenerator 註解指定序列名,MySql不支持這種方式 
–TABLE:經過表產生主鍵,框架藉由表模擬序列產生主鍵,使用該策略可使應用更易於數據庫移植。

 通常MySQL使用  @GeneratedValue(strategy = GenerationType.IDENTITY)

 

15字段自動更新

啓動類加@EnableJpaAuditing
@EnableJpaAuditing

@EntityListeners(AuditingEntityListener.class) 是用於監聽實體類添加或者刪除操做的。

@JsonIgnoreProperties(value = {"createdAt", "updatedAt"},
allowGetters = true) 這個註解是用於在除了在獲取createAt,updateAt屬性時進行操做,其餘建立和更新操做都由jpa完成

@Column(nullable = false, updatable = false) 其中updatable = false表示不進行更新操做

@CreatedDate 表示該字爲建立時間字段,在這個實體被insert時,設置值;@LastModifiedDate同理

 

16:請求參數接收的格式

@RequestParam post 請求不支持json格式

ajax的時候,爲了方即可以使用get,可是不安全

 $("#apply_link_form").submit(function(){
        parent.layer.close(index); //再執行關閉
        $.ajax({
            async: false,
            type: "POST",
            url:'${pageContext.request.contextPath}/link/apply',
            contentType : "application/x-www-form-urlencoded; charset=utf-8",
            data:$("#apply_link_form").serialize(),
            dataType: "text",
            success: function () {
              },
            error: function () {
            }
        })
    })
contentType : "application/x-www-form-urlencoded; charset=utf-8",

這個是關鍵

17:spring-boot @Component和@Bean的區別

@Component 是用在類上的

@Component
public class Student {
private String name = "lkm";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}


@Bean 須要在配置類中使用,即類上須要加上@Configuration註解

@Configuration
public class WebSocketConfig {
@Bean
public Student student(){
return new Student();
}
}

若是你想要將第三方庫中的組件裝配到你的應用中,在這種狀況下,是沒有辦法在它的類上添加@Component註解的,所以就不能使用自動化裝配的方案了,可是咱們可使用@Bean。

18.jpa參考手冊

https://blog.csdn.net/qq_37939251/article/details/83052613

https://blog.csdn.net/yswknight/article/details/79257372

 

19,list的在for循環的時候使用add ,remove都會出現java.util.ConcurrentModificationException

解決辦法:使用Iterator的add ,remove

 

20,Iterator引發的java.util.NoSuchElementException異常

不論什麼狀況

一個while裏面不能調用兩次next,不會邊界溢出,異常錯誤名稱很明顯

demo

public List<AdminPermission> filterMenu(List<AdminPermission> permissionList, BigInteger adminId) throws Exception {
        List<BigInteger> adminPermission = getAdminPermission(permissionList, adminId);
        System.err.println(adminPermission.toString());

        // 過濾菜單,目前固定三層
        // list的在for循環的時候使用add ,remove都會出現java.util.ConcurrentModificationException
        // 使用Iterator的remove
        Iterator<AdminPermission> itr = permissionList.iterator();

        while (itr.hasNext()) {
            List<AdminPermission> child1 = itr.next().getChild();
            Iterator<AdminPermission> itr1 = child1.iterator();

            while (itr1.hasNext()) {
                List<AdminPermission> child2 = itr1.next().getChild();
                Iterator<AdminPermission> itr2 = child2.iterator();

                while (itr2.hasNext()) {
                    if (!adminPermission.contains(itr2.next().getId())) {
                        itr2.remove();
                    }
                }
                // 必須這樣寫,否則會溢出邊界
                if (child2.size() == 0) {
                    itr1.remove();
                }
            }
            if (child1.size() == 0) {
                itr.remove();
            }

        }

        return permissionList;

 

 

21:getOne 方法出現 org.hibernate.LazyInitializationException: could not initialize proxy [com.zs.logistics.model.New#656] - no Session

主要是由於 數據庫模型有些字段懶加載致使的

解決辦法:

spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true

在操做的實體上加上

@Proxy(lazy = false)

 這個任何使用對加載性能有影響的,本身斟酌,我的建議,配置爲主,由於你不知要其餘開發人員的開發習慣,規避bug

 

22,freemarker時間,數字格式化

https://blog.csdn.net/pengpengpeng85/article/details/52070602

 

23;PageRequest pageable 翻頁問題是從0開始的,可是頁面翻頁是從1開始,減一就能夠,須要添加判斷

PageRequest pageRequest = PageRequest.of(pageNo - 1, pageSize, sort);

 

24,com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) 

錯誤緣由json化字段有null的值

發現是實體類中有的字段值爲null,因此在json化的時候,fasterxml.jackson將對象轉換爲json報錯

解決辦法:

  在實體類上面加上註解 @JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })

 

25,Spring JPA 使用@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy 自動生成時間和修改者

1.實體類加註解
/**
 * 建立時間
 */
@CreatedDate
@Column(name = "create_time")
private Date createTime;

/**
 * 修改時間
 */
@LastModifiedDate
@Column(name = "modify_time")
private Date modifyTime;


2.實體類頭加註解

@EntityListeners(AuditingEntityListener.class)

3.SpringBoot啓動類加註解

@EnableJpaAuditing

在spring jpa中,支持在字段或者方法上進行註解@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy,從字面意思能夠很清楚的瞭解,這幾個註解的用處。

 
 

@CreatedDate
表示該字段爲建立時間時間字段,在這個實體被insert的時候,會設置值
@CreatedBy
表示該字段爲建立人,在這個實體被insert的時候,會設置值
@LastModifiedDate、@LastModifiedBy同理

 

 25,添加阿里雲鏡像

pom.xml

<repositories>
        <repository>
            <id>central</id>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <layout>default</layout>
            <!-- 是否開啓發布版構件下載 -->
            <releases>
                <enabled>true</enabled>
            </releases>
            <!-- 是否開啓快照版構件下載 -->
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

簡單版

<repositories>
        <repository>
            <id>aliyunmaven</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        </repository>
    </repositories>

 

26,This compilation unit is not on the build path of java project

.project 文件 加上

<nature>org.eclipse.jdt.core.javanature</nature>

27,editor does not contain a main type

在 解決方法: 對着:src 路徑右鍵 -> Build Path -> Use as Source Folder

28,java.sql.SQLNonTransientConnectionException: Could not create connection to driver: com.mysql.cj.jdbc.Driver

url: jdbc:mysql://localhost:3306/yinliu?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
 
driver: com.mysql.cj.jdbc.Driver


29,com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

mysql配置文件添加
wait_timeout=1814400

 

30 jpa映射 json格式數據

<!-- https://mvnrepository.com/artifact/com.vladmihalcea/hibernate-types-5 -->
<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-5</artifactId>
    <version>2.4.3</version>
</dependency>
並將此行添加到實體

@TypeDef(name = "json", typeClass = JsonStringType.class)
@Type( type = "json" name = "json_value")
   @Column( columnDefinition = "json" )
   private List<String> jsonValue;

 31,mysql tinyint 若是使用unsigned 是1-255,因此映射到jpa不能使用byte 須要int,java沒有無符號定義,byte 是-127到128

32,單引號,雙引號的區別

單引號引的數據 是char類型的——》單引號只能引一個字符(表示單個字符)雙引號引的數據 是String類型的——》而雙引號能夠引0個及其以上(引用字符串)char類型的值用單引號引發來的單個字符如: char a = 'b'
而java中的雙引號 表示字符串 一個或多個字符
如 String c = "abc"
String d="a"
和char d=‘a’
相關文章
相關標籤/搜索