DNS Resolution Problem at start on Apple M2

最近把 Spring Boot 升級到 3.2.1 後、莫名的遇到了以下的警告:

Unable to load io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider, fallback to system defaults. This may result in incorrect DNS resolutions on MacOS. Check whether you have a dependency on 'io.netty:netty-resolver-dns-native-macos'. Use DEBUG level to see the full stack: java.lang.UnsatisfiedLinkError: failed to load the required native library

經查:應該是因為在使用M晶片的 macOS 上缺了系統需要的 Library。

在 pom.xml 加入以下依賴即可解決:

<!-- https://mvnrepository.com/artifact/io.netty/netty-all -->
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
        </dependency>

How to modify the file of Docker’s container

最近將寫好的 Spring Boot jar 放到 Docker 裡執行;結果⋯⋯發生了和 The server selected protocol version TLS10 is not accepted 一樣的問題。初期時還到處找到底是那裡出問題了導致無法連線到 SQL Server ;靈光一閃才想到這個解法。但⋯⋯同時就出現了:如何進到 Docker Container 中去修改檔案的問題囉!

先列出 Docker 目前有在執行的容器以便取得 Container ID。

docker ps 

進入容器。

docker exec -it 容器ID bash

一般來說、在 Container 中若沒有事先設定(在Dockerfile設定那篇文章裡已有加入新設定);是會沒有安裝我們等等要用來修改文件的「vim」,所以要再多加以下步驟去安裝。

# 先升級內部套件
apt-get update
# 安裝 vim 
apt-get install vim

找某一個檔案的方法(這裡以 java.security 為例)。

find / -name java.security

進入檔案目錄、並開啟檔案修改。

# 進入目錄
cd /opt/java/openjdk/conf/security
# 修改檔案
vim java.security

依照 The server selected protocol version TLS10 is not accepted 修改後、重啟 Docker Container 。

docker restart 容器ID

Spring Boot 101 with GitHub

配合 GitHub 創建一個 Spring Boot Project。

  • 先進入到 GitHub 的網頁。點擊 New 按扭去新增一個 Repository。

  • 輸入名稱、並點擊下方按鈕創建。

  • 如果沒有特別去設定 SSH key 的話、就必需得是 https開頭。將此網址複製。

  • 開啟 IntelliJ 、點擊右上角的 Get from VCS 。

  • 貼上剛剛複製的連結並點擊右下角的 Clone 。

  • 先關掉 IntelliJ、進到剛剛 Clone 的資料夾、刪掉 .idea 的隱藏資料夾。

  • 回到 IntelliJ 、選擇 New Project 創建和剛剛相同名稱的 Project 、此時會出現警告視窗、直接 Yes 即可。

  • 在 Dependencies 這裡、依個人所需選擇。(Spring Web, JDBC API, MS SQL Server DRiver)

  • 建立完成後可點擊右下角的 Always Add 、讓 IntelliJ 自動將檔案加到 Git 版本控制下、加好後可看到左邊檔案會變成綠色的狀態。

  • 將以下多餘的檔案刪掉。

  • 設定 pom.xml

<!--SQL2008 https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc -->
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <version>7.2.2.jre11</version>
        </dependency>
<exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
</exclusions>
  • 點選左邊的 Commit 、填入說明、點擊 Commit and Push 進行第一次上傳。

  • 回到 GitHub 上檢查、收工。

jQuery’s GET,POST,PUT and DELETE example

知道很多人不看說明、就想直接 copy 程式碼去測(我說我自己XD);所以先上程式碼、廢話放在後面。

jQuery 版本:jquery-3.6.0.min.js

GET

$.ajax({
    type: "GET",
    contentType: "application/json;charset=utf-8", // 要寫、不然會報 415 Error
    url: "/lbzls/getlbzlsList/" + td[0].innerText,
    dataType: "json",
    success: function (lbzlsList) {
    $.each(lbzlsList, function (key, value) {
        $("#lbzls_getList").append("<tr onMouseOut='this.style.backgroundColor=\"\"' onMouseOver='this.style.backgroundColor=\"#B2C67F\"';>" +
        "<td>" + value.lbdh + "</td>" +
        "<td>" + value.zwsm + "</td>" +
        "<td>" + value.bz + "</td>" +
        "<td>" + value.bz1 + "</td>" +
        "<td class='delCol' style='display: none;'>" +
            "<input class='delColButton' type='button' value='Del' style='font-size: 0.75rem; width: 2rem;' />" +
        "</td>" +
        "</tr>");
        });
    },
    beforeSend: function () {
        $.blockUI();
    },
    complete: function () {
        $.unblockUI();
    },
    error: function () {
        alert("未取得类别明细资料!");
    }
});

POST

// POST-Insert、 创建,会产生新的数据,则用POST
.ajax({
    type: "POST",
    contentType: "application/json;charset=utf-8", // 要寫、不然會報 415 Error
    url: "/lbzls/insertlbzl/",
    data: JSON.stringify({ "oldlbzl": [templbzl], "newlbzl": [lbzl], "newlbzls": lbzlsData }), // 因為jQuery安全性升高、所以要這樣寫
    dataType: "text", // 回傳 String
    success: function (message) {("#content").load("lbzls");
    }
});

PUT

// PUT-Update、更新,并不会产生新的数据,新的数据会覆盖老的数据,用PUT
$.ajax({
    type: "PUT",
    contentType: "application/json;charset=utf-8", // 要寫、不然會報 415 Error
    url: "/lbzls/updatelbzl/",
    data: JSON.stringify({ "oldlbzl": [templbzl], "newlbzl": [lbzl], "newlbzls": lbzlsData }), // JSON傳值
    dataType: "text",
    success: function (message) {
        alertify.success("修改成功!!");
    }
});

DELETE

$.ajax({
    type: "DELETE",
    contentType: "application/json;charset=utf-8", // 要寫、不然會報 415 Error
    url: "/lbzls/deletelbzl/",
    data: $("#textlb").val(),
    dataType: "text",
    success: function (message) {
        alertify.success("删除成功");
    }
});

貼完程式碼,突然也覺得沒什麼好說的;這是 2016 年之後再次把 jQuery 拿出來寫;不為別的、只是因為直至現在 2022 年、一直想學的 React 和 VUE 還是沒學好,所以只好繼續玩最熟的 jQuery 。留下這篇也只是因為發現自己太久沒寫了、很多基本東西(語法、JSON 傳值⋯⋯)都變得很不熟悉。

還是那句話:「不進則退」。

IDEA solved “Wrong tab” Warning Message

其實這個問題的根本就是:在 Java Doc 裡不存在這個標籤、所以只需在設定中新增標籤即可。

注意事項:需在 Default IDE 裡做設定、才不會下一次開新的 Project 時又出現錯誤。

配置路徑如下:
Settings / Preferences -> Editor -> Inspections -> Java -> Javadoc -> Javadoc declaration problems -> Options -> Additional Javadoc tags

IDEA-一劳永逸的解决-Wrong-tag-警告信息

The server selected protocol version TLS10 is not accepted

錯誤環境:使用 OpenJDK 11 連線 SQL Server 2008 時,發生了找不到 openjdk 驅動程式無法使用安全通訊端層 (SSL) 加密建立與 SQL Server 的安全連接。錯誤: “The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]”。 ClientConnectionId:e98d4e86-b063-47d6-8bc7-7e0c482b146d 的結果。

發生原因:眾說紛云。
一、升級至 JAVA11 後、TLSv1 & TLSv1.1 被預設 Disabled。
二、SQL Server 2008 要求加密連線、需更新。

解決方法
在不動到 Server 的情況下,嘗試改寫連線方式及各種無腦測試後、以最簡單的方式解決了。

在 java.security 這個設定檔中,找到 jdk.tls.disabledAlgorithms ,刪掉其中的 TLSv1 、即可連線成功。

TLSv1

  • 在 Google 時發現,很多文章都會寫此檔案放在 %JAVAHOME%\JAVA\jreXXX\lib\security 中、一開始時一直沒找到;後來我反而是在 %JAVAHOME%\jdk-11.0.13.8-hotspot\Conf\Security 中找到的。有可能是因為版本的不同所以導致資料夾不同,有時候多注意一下,以免浪費了不必要的時間。

20230822 Tips:
在 Mac OS 中尋找 Java 安裝位置

/usr/libexec/java_home -v

20240124 Tips:
最近試著升級成 jdk 17 & SpringBoot 3.2.1 時、遇到了以下問題:

“encrypt” 屬性設定為 “true” 且 “trustServerCertificate” 屬性設為 “false”,但驅動程式無法使用安全通訊端層 (SSL) 加密建立 SQL Server 的安全連線: 錯誤: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target。 ClientConnectionId:77468a01-4798-4f83-a45c-b1b4e5833e6b

除了之前把 TLSv1 去除掉之外、需要在 application.properties 中再增加設定:

spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.datasource.url=jdbc:sqlserver://127.0.0.1:1433;databaseName=LYS_ERP;encrypt=false

雖然是可以連絡了、但還是會出現以下警告訊息:
TLSv1 was negotiated. Please update server and client to use TLSv1.2 at minimum.

主要問題還是在於 SQL 2008 、就先撐著吧、看何時解決不了不得不升級囉!

[Jersey 續] POST 傳資料

上一篇中的 HelloJersey 增加功能,使用 POST 傳資料,僅添加新增部份,至於測試需要 PostMan 、解釋等等就跳過囉!

package com.test.jersey;

import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;

@Path("/hello") //提供服務的 URL
public class HelloJersey {

    @GET //對應的要求方法:可以改為 GET, POST, PUT, DELETE

    public String sayHello() {
        return "Hello, Jersey";
    }

    @Path("addcust") //這是為了與 sayHello() 區分增加的 URL
    @POST // 改為 POST 傳資料
    @Produces("text/plain") //傳遞資料格式ex:@Produces("text/html")
    //@QueryParam 來自於 URL 的查詢參數、這裡需加不然會抓不到資料
    public String customerAdd(@QueryParam("cid")String id ){
        return String.format("%s ADDOK!!", id);
    }

}

REST with Java (JAX-RS) using Jersey2.X(web.xml & class)

在網路上查到的資料都稍舊了些,所以自己來寫一篇囉!

定義:Jersey client API 是一組非常 High level API,可以讓我們很輕鬆的開發 Restful web services client。

以下只寫到出現 Hello World 即停止。程式結構如下圖:

閱讀全文〈REST with Java (JAX-RS) using Jersey2.X(web.xml & class)〉

Unsupported major.minor version 52.0 解法

前言:覺得有些奇怪。在 Synology NAS 上只能安裝 Tomcat 7.X 版(不使用第三方程式下),而且預設只能用 JDK 1.7 版,這次上傳程式時忘了改卻能正常使用;過了幾天後直到有使用者反應跑不出運行畫面才發現原來是有問題的,關於這點需要再研究一下。

錯誤訊息:Unsupported major.minor version 52.0

閱讀全文〈Unsupported major.minor version 52.0 解法〉

Struts 2.X of Eclipse for J2EE – 靜態互動

Struts 系列文章第四篇。這篇主要進入前端資料送到後端的初階方式,還沒有到處理完再回送到網頁的部份;就簡單在網頁打個字、按鈕、送到 Server 端顯示文字、同時轉到成功頁面。

一樣、先上程式碼;如果有要補充的再等下篇。

  • 基本的檔案需求及位置。

閱讀全文〈Struts 2.X of Eclipse for J2EE – 靜態互動〉