顯示具有 java 標籤的文章。 顯示所有文章
顯示具有 java 標籤的文章。 顯示所有文章

2020年9月23日 星期三

[java]使用okhttp3時發生SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

at sun.security.ssl.Alerts.getSSLException(Unknown Source)

at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)

at sun.security.ssl.Handshaker.fatalSE(Unknown Source)

at sun.security.ssl.Handshaker.fatalSE(Unknown Source)

at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)

at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)

at sun.security.ssl.Handshaker.processLoop(Unknown Source)

at sun.security.ssl.Handshaker.process_record(Unknown Source)

at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)

at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)

at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)

at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)

at okhttp3.internal.connection.RealConnection.connectTls(RealConnection.java:268)

at okhttp3.internal.connection.RealConnection.establishProtocol(RealConnection.java:238)

at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:149)

at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:192)

at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:121)

at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:100)

at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)

at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)

at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)

at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)

at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)

at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)

at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)

at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)

at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:120)

at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)

at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)

at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:185)

at okhttp3.RealCall.execute(RealCall.java:69)


 

解法

new OkHttpClient();改成getUnsafeOkHttpClient();

import javax.net.ssl.HostnameVerifier;

import javax.net.ssl.SSLContext;

import javax.net.ssl.SSLSession;

import javax.net.ssl.TrustManager;

import javax.net.ssl.X509TrustManager;


/**

* okHttp3信任所有證書

* @return OkHttpClient

*/

public static OkHttpClient getUnsafeOkHttpClient() {

try {

final TrustManager[] trustAllCerts = new TrustManager[]{

new X509TrustManager() {

@Override

public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {

}

@Override

public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {

}

@Override

public java.security.cert.X509Certificate[] getAcceptedIssuers() {

return new java.security.cert.X509Certificate[]{};

}

}

};

final SSLContext sslContext = SSLContext.getInstance("SSL");

sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

final javax.net.ssl.SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

OkHttpClient.Builder builder = new OkHttpClient.Builder();

builder.sslSocketFactory(sslSocketFactory);


builder.hostnameVerifier(new HostnameVerifier() {

@Override

public boolean verify(String hostname, SSLSession session) {

return true;

}

});

return builder.build();

} catch (Exception e) {

throw new RuntimeException(e);

}

}






2020年5月29日 星期五

[java]NoClassDefFoundError

問題
Caused by: java.lang.NoClassDefFoundError: org/apache/http/HttpEntity

NoClassDefFoundError 錯誤發生原因
因為程式在執行時,找不到此class導致的錯誤。此時jvm就會拋出NoClassDefFoundError

如何解決
找出此class對應的jar,載入到classpath中即可

2020年5月28日 星期四

eclipse 快速提醒相關聯指令

看到前輩key 任何字,馬上就有相關聯的提示出現
不同於alt + /
立馬詢問怎麼調整

點選 Menu: Windows > Preferences > Java > Editor > Content Assist
在Auto activartion triggers for Java填入『.@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ』











結果

2019年8月1日 星期四

[java]地址隱碼

/**
* 地址隱碼
 * @param address
* @return
*/
public static String addressToMaskFormat(final String address)
{
if (StringUtils.isEmpty(address))
{
return "";
}
//郵政信箱不隱碼:臺北北門郵局第○○號信箱
if (address.contains("信箱"))
{
return address;
}
//地址自路段後全隱
final String zoneValue = address.replaceAll("^(.*[鄉|鎮|市|區])(.*)$", "$1"); //鄉鎮市區資訊
final String fullRoadValue = address.replaceAll("^(.*[鄉|鎮|市|區])(.*)$", "$2"); //路段之後的資訊
System.out.println("zoneValue="+zoneValue);
System.out.println("fullRoadValue="+fullRoadValue);
if (StringUtils.isNotEmpty(zoneValue) && StringUtils.isNotEmpty(fullRoadValue))
{
String laneValue = fullRoadValue;//預設巷弄號樓資訊
String roadValue = fullRoadValue.replaceAll("^(.*[路|段|街])(.*)$", "$1");//截取正常路段名資訊
if (StringUtils.isNotEmpty(roadValue) && !roadValue.equals(laneValue))
{
laneValue = fullRoadValue.replaceAll("^(.*[路|段|街])(.*)$", "$2"); //有正常路段名資訊 XX路 XX段 XX街 時,再截取巷弄號樓資訊
}else{
roadValue="";
}

final String visibleLaneValue = laneValue.replaceAll("([0-9|0|1|2|3|4|5|6|7|8|9|一|二|三|四|五|六|七|八|九|十]*[巷|弄|號].*)$", "");
final String hiddenLaneValue = laneValue.replaceAll(visibleLaneValue, "");

if (StringUtils.isNotEmpty(hiddenLaneValue) && hiddenLaneValue.length() > 1)
{
//hiddenLaneValue不超過1碼時,代表地址不全,全隱
return zoneValue + roadValue + visibleLaneValue + addStar("", hiddenLaneValue.length());
}
}

//上面地址格式不對時
if (address.length() > 10)
{
final String hiddenValue = address.replaceAll("^(.{10})(.*)$", "$2");
return address.replaceAll(hiddenValue, addStar("", hiddenValue.length()));
}

//若地址不足10碼,則直接出******
return "******";

}

/**
*
* @param str 欲格式化的字串
* @param len  格式化長度
* @param fillchar 想補齊的字元
* @return
*/
public static String addStar(final String str, final int len)
{
final String fillchar = "*";
final StringBuffer sb = new StringBuffer();
if (str == null)
{
for (int i = 0; i < len; i++)
{
sb.append(fillchar);
}
}
else
{
final int strLen = str.length();
if (strLen < len)
{
for (int i = 0; i < (len - strLen); i++)
{
sb.append(fillchar);
}
return str + sb.toString();
}
else
{
if (str.length() == len)
{
return str;
}
else
{
return str.substring(0, len);
}
}
}
return sb.toString();
}

2019年7月31日 星期三

[java]電話號碼/手機號碼隱碼

public static String phoneNumberToMaskFormat(final String phoneNumber)
{
if (StringUtils.isEmpty(phoneNumber))
{
return "";
}
final String cleanNumber = phoneNumber.replaceAll("[\\(\\)\\- ]*", "");//去除符號()-
if (StringUtils.isNotEmpty(cleanNumber) && cleanNumber.length() > 4)
{
//去符號讓第2-5個數字替換成星
//例:(02)2960-3456=>0****03456
//例:(037)364220=>0****4220
return cleanNumber.replaceAll("^(\\d{1})(\\d{4})(.*)$", "$1****$3");
}
//cleanNumber不超過4碼時
return "******";

}

public static String mobileNumberToMaskFormat(final String mobileNumber)
{
if (StringUtils.isEmpty(mobileNumber))
{
return "";
}
//留頭4字及尾3字,中間3字替換成星
//例:0912123456=>0912***456
if (mobileNumber.length() == 10)
{
return mobileNumber.replaceAll("^(.{4})(.*)(.{3})$", "$1***$3");
}
//mobileNumber不為10碼時
return "******";

}

[java]日期的年份隱碼

public static String yearToMaskFormat(final Date date)
{
if (date == null)
{
return "";
}
//將年換成星,例:1955/04/01=>****/04/01
final DateFormat df = new SimpleDateFormat("yyyyMMdd");
try
{
return df.format(date).replaceAll("^(\\d{4})(\\d{2})(\\d{2})$", "**** /$2/$3");
}
catch (final Exception e)
{
e.printStackTrace();
}
return "******";

}

[java]身分證號隱碼

public static String idToMaskEnd4Format(final String id)
{
if (StringUtils.isEmpty(id))
{
return "";
}
//尾4字替換成星
//例:A123456789=>A12345****
if (id.length() == 10)
{
return id.replaceAll("^(.*)(\\d{4})$", "$1****");
}
//id不為10碼時
return "******";
}

2019年3月26日 星期二

[程式]兩個資料比較,找出相同且不重複的資料

How to convert List to Set (ArrayList to HashSet)

List<TestObject> list1 = new ArrayList<TestObject>();
List<String> list2 = new ArrayList<>();
List<String> filtedlist = new ArrayList<>();

TestObject to = new TestObject();
to.setCode("a1");
list1.add(to);
to = new TestObject();
to.setCode("a2");
list1.add(to);
to = new TestObject();
to.setCode("a3");
list1.add(to);
to = new TestObject();
to.setCode("a4");
list1.add(to);
to = new TestObject();
to.setCode("a5");
list1.add(to);


list2.add("a2");
list2.add("a4");
list2.add("a2");
list2.add("a4");
list2.add("a2");
list2.add("a4");

//寫法一
for (TestObject testo : list1) {
if(list2.contains(testo.getCode())) {
filtedlist.add(testo.getCode());
}
}

//寫法二
Set<String> set = new HashSet<String>(list2);//Convert List to Set
for (TestObject testo : list1) {
if(set.contains(testo.getCode())) {
filtedlist.add(testo.getCode());
}
}

for (TestObject testo : list1) {
System.out.println("all==>"+testo.getCode());
}
for (String string : list2) {
System.out.println("override==>"+string);
}
for (String string : filtedlist) {
System.out.println("filted==>"+string);
}

2019年1月8日 星期二

[程式]Spring NoSuchBeanDefinitionException原因分析

WARN  [localhost-startStop-1] [CloseAwareApplicationContext] Exception encountered during context initialization - cancelling refresh attempt
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'generalSyncService': Injection of resource dependencies failed;
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'acountLoader': Injection of resource dependencies failed;
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'acountDao': Injection of resource dependencies failed;
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataLoadService': Injection of resource dependencies failed;
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'commonService': Injection of resource dependencies failed;
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dbDataService' defined in class path resource [project-spring.xml]: Cannot resolve reference to bean '#{configurationService.configuration.getProperty('DbDataStrategy.impl')}'while setting bean property 'DbDataStrategy';
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'null' is defined
        at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:308)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1210)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)


2016年9月5日 星期一

eclipse 滑鼠游標停留的變數(相同變數)背景高亮度顏色設定


因為不是用預設的白底黑字的佈景主題,所以本來很明顯的語法提示都變得不明顯了

此篇記錄當游標停留在變數上時,其他相同變數的也會跟著高亮度語法提示
Window\Preferences\General\Editors\Text Editors\Annotations

Occurrences 游標停留變數上
Write Occurrences 相同變數,且是初始變數




















結果





2016年9月4日 星期日

eclipse 區塊提示高亮度設定

當xml寫得又臭又長的時候,要找到這個區段的開始跟結束有些麻煩,但是eclipse有語法高亮度可以設定,這樣只要游標停留在開始或是結尾的地方,相對應的地方會高亮度提示

Window\Preferences\General\Editors\Structured Text Editor
Appearance\Matching brackets highlight






















java的區塊提示
Window\Preferences\Java\Editor
Matching brackets highlight




2016年3月10日 星期四

在eclipse使用多行編輯

像notepad++,UltraEdit...等文字編輯器,有提供多行編輯的功能...
多行編輯就是一次在多行寫入一樣的內容












而eclipse也有提供一樣的功能,就在工具列





如果找不到這個圖示,請確定現在所在的檔案的副檔名是不是java,只有在java檔的檔案下這個功能的按鈕才會出現,但是任何檔案都可以使用這個模式編輯
使用完畢記得關起來,才能正常編輯

2015年12月28日 星期一

java new HashMap(initialize) 宣告 Map 同時將其初始化

在宣告 List 或 Map 類別同時將其初始化。寫法如下:
方法一:
public class TestUtils {

private static final Map<String, String> MAPTEST = new TreeMap<String, String>()
{{
put("NAME1","RR1");
put("NAME2","RR2");
put("NAME3","RR3");
put("NAME4","RR4");
put("NAME5","RR5");
}};

public static String getMapValue(String key){
String value = "";
if(StringUtils.isNotBlank(key)
&& StringUtils.isNotBlank(MapUtils.getString(MAPTEST, key))){
value = MAPTEST.get(key);
}
return value;
}

public static String[] getMapValues(){
String[] values = new String(MAPTEST.size());
int i = 0;
for(String key:MAPTEST.keySet()){
values[i] = MAPTEST.get(key);
i++;
}
return values;
}
}

方法二:
public class TestUtils {

private static final Map<String, String> MAPTEST = new TreeMap<String, String>();

static {
put("NAME1","RR1");
put("NAME2","RR2");
put("NAME3","RR3");
put("NAME4","RR4");
put("NAME5","RR5");
}

}

java HashMap LinkedHashMap TreeMap

HashMap使用Hash Table,因而它有自己的排序方式,若要使用插入的順序來排序,則可以使用LinkedHashMap,

TreeMap實作Map介面與SortedMap介面,提供相關的方法讓您有序的取出對應位置的物件,像是 firstKey()、lastKey()等方法,TreeMap是J2SE中唯一實作SortedMap介面的類別,它使用紅黑樹結構來對加入的物件進 行排序。

2015年12月26日 星期六

eclipse alt+/ 無反應的解決方法(Content Assist)

換個版本的eclipse發現alt+/無反應
原因是eclipse每個版本的熱鍵都有些微的不同




解決方法:
1. 將 word completion 的快捷鍵改為其他的.
    例如 ALT + C   (預設是 ALT + /)






















2. 把 content assist 的快捷鍵由 Ctrl + space(跟windows key衝突) 改成 ALT + /



2015年12月19日 星期六

使用maven jetty開發,發生java.io.FileNotFoundException

在啟動本機開發環境時,發生java.io.FileNotFoundException
到對應專案webapp資料夾內空空如也,應該要有一堆編譯過後的檔案(*.xml,*.class...等)

代表此時環境所有編譯過的檔案都被清除,所以在啟動jetty時後面應該要接run,jetty才會生成檔案

2015年12月13日 星期日

在eclipse的project explorer區塊調整字體大小

使用eclipse版本:Luna Service Release 1 (4.4.1)
確認自己的theme的樣式,Preferences\General\Appearance\theme
這裡使用windows 7,Color and Font theme:Default

相對路徑下:
\eclipse-luna\plugins\org.eclipse.ui.themes_1.0.1.v20140819-1717\css\e4_default_win7.css

在檔案最後面加上,重開eclipse
#org-eclipse-jdt-ui-PackageExplorer Tree,
#org-eclipse-ui-navigator-ProjectExplorer Tree,
#org-eclipse-ui-views-ContentOutline Tree,
#PerspectiveSwitcher ToolBar {
  font-size: 10px;
}
^