2015年2月12日 星期四

java.lang.NoClassDefFoundError: net/sf/json/JSONArray



繼上次那篇

JBoss & RESTEasy





這篇可以幫你避免

java.lang.NoClassDefFoundError : net/sf/json/JSONArray

java.lang.NoClassDefFoundError: net/sf/json/JSONArray



在專案中使用 json-lib-2.4 來幫忙物件轉出 json

使用的到的是以下這些

\lib\commons-beanutils.jar
\lib\commons-collections.jar
\lib\commons-lang.jar
\lib\commons-logging.jar
\lib\ezmorph-1.0.6.jar
\lib\json-lib-2.4-jdk15.jar





加到Build Path之後
在WEB-INF資料夾中建立 lib 資料夾
然後把要用到的jar都丟進去lib

接著在pom.xml中加入

<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
</dependency>

 這樣就可以開始用

import net.sf.json.JSONArray;




2015年2月8日 星期日

JBoss & RESTEasy



#這篇是翻譯文章,並且補充說明


RESTEasy Hello World Example


開發環境

  • Eclipse Kepler 
  • JBoss 6.x Runtime Server
  • RESTEasy 2.2.1.GA
  • jre7


Download Source Code
Download it – RESTEasy-Hello-World-Example.zip (7 KB)

當把檔案下載回來後


1. Import 進你的專案目錄

2. 找不到這些jar檔嗎?

M2_REPO/org/jboss/resteasy/resteasy-jaxrs/2.2.1.GA/resteasy-jaxrs-2.2.1.GA.jar
M2_REPO/org/jboss/resteasy/jaxrs-api/2.2.1.GA/jaxrs-api-2.2.1.GA.jar
M2_REPO/org/apache/httpcomponents/httpcore/4.0.1/httpcore-4.0.1.jar
M2_REPO/org/apache/httpcomponents/httpclient/4.0.3/httpclient-4.0.3.jar
M2_REPO/commons-codec/commons-codec/1.2/commons-codec-1.2.jar
M2_REPO/commons-httpclient/commons-httpclient/3.1/commons-httpclient-3.1.jar
M2_REPO/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar
M2_REPO/junit/junit/4.8.2/junit-4.8.2.jar


請至 RESTEasy  下載 RESTEasy 2.2.1.GA 

或到 sourceforge 下載 resteasy-jaxrs-2.2.1.GA-all.zip

然後重新修改你import的Libraries
  •  Java Build Path -> Libraries 
 
重新加入你下載回來的這些jar檔

  • resteasy-jaxrs-2.2.1.GA.jar
  • jaxrs-api-2.2.1.GA.jar
  • httpcore-4.0.1.jar
  • httpclient-4.0.3.jar
  • commons-codec-1.2.jar
  • commons-httpclient-3.1.jar
  • commons-logging-1.0.4.jar
junit-4.8.2.jar 用不到就不用加了


接著
  • Run AS-> Run as Server

選擇 
  • JBoss 6.x Runtime Server

確認你的JBoss work 之後

訪問

Test 1 : http://localhost:8080/RESTfulExample/rest/message/mkyong

Test 2 : http://localhost:8080/RESTfulExample/rest/message/hello%20world


Good Luck!

 



 

2015年2月7日 星期六

Class for Dynamic Logger using C# & log4net.



有時候Asp.net 、web service或寫 C# 會需要紀錄程式的log,

自己寫個文字檔當記錄也是可以,但是如果有現成的就不用自己刻。

這裡整理一下log4net的幾種用法,做為參考


本篇介紹Asp.net WebApplication 有IIS的case

如果你有先玩過log4net再來看這篇!!!





網路上教學很多都是需要在Global.asax 上啟用

這會遇到一個問題,如果IIS(機器)在人家手上,可不能給我上線每次說啟用就啟用

有時候軟重啟(ReStart)IIS 都要求人家幫你開,太痛苦了...

正在run 又要同時上新功能的也不可能讓你把IIS停下來

如果你所有的common log都是寫在同一個log file

你也不太可能在新上版的程式裡隨意的加上Shutdown

log.Logger.Repository.Shutdown();
然後每次呼叫方法時,都開開關關這樣,

這樣搞,共用log有可能被你關掉導致其他程式無法寫入


下面提供一個範例,Dyamic Logger動態的產生一個實體Logger

範例中的寫法不需要吃外部Xml config,

要吃也可以啦,看你要吃什麼設定檔什麼參數,

拉出去吃Web.config或自訂XML都可以。





using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using log4net;
using System.Reflection;
//using log4net.Config;
//using log4net.Repository.Hierarchy;
//using log4net.Appender;
//using log4net.Layout;
//using log4net.Core;

namespace WebApp_log4net
{

    public class HandlerforLog : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            Write("Application is starting");
            context.Response.ContentType = "text/plain";
            context.Response.Write("Hello World");
        }

        public void Write(String message)
        {
            ILog myLog = GetDyamicLogger();
            myLog.Info("[Write]:" + message);
        }

        public static ILog GetDyamicLogger()
        {
            log4net.Repository.Hierarchy.Hierarchy hierarchy = 
            (log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository();
            log4net.Appender.RollingFileAppender roller = 
              new log4net.Appender.RollingFileAppender();
            roller.LockingModel = new log4net.Appender.FileAppender.MinimalLock();
            roller.AppendToFile = true;
            roller.RollingStyle = 
               log4net.Appender.RollingFileAppender.RollingMode.Composite;
            roller.MaxSizeRollBackups = 29; // 0~29 is 30. 
            roller.MaximumFileSize = "10MB";
            roller.DatePattern = "yyyyMMdd";
            roller.Layout = new log4net.Layout.PatternLayout();
            roller.File = "log\\debug.log";
            roller.StaticLogFileName = true;

            log4net.Layout.PatternLayout patternLayout = 
                  new log4net.Layout.PatternLayout();
            patternLayout.ConversionPattern = 
             @"%date [%thread] %-5level %logger [%property{NDC}] - %message%newline";
            patternLayout.ActivateOptions();

            roller.Layout = patternLayout;
            roller.ActivateOptions();
            hierarchy.Root.AddAppender(roller);

            hierarchy.Root.Level = log4net.Core.Level.All;
            hierarchy.Configured = true;

            DummyLogger dummyILogger = new DummyLogger("LogName");
            dummyILogger.Hierarchy = hierarchy;
            dummyILogger.Level = log4net.Core.Level.All;
            dummyILogger.AddAppender(roller);

            return new log4net.Core.LogImpl(dummyILogger);
        }

        internal sealed class DummyLogger : log4net.Repository.Hierarchy.Logger
        {
            // Methods
            internal DummyLogger(string name)
                : base(name)
            {
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}




參考資料

http://amolgangawane.blogspot.tw/

http://www.howtosolvenow.com/2014/01/log4net-example-in-c-console-application/

http://www.curlette.com/?p=1113

http://interactivelogic.net/wp/2010/02/aspnet-logging-to-output-window-with-log4net/

http://weblogs.asp.net/stevewellens/log4net-log-to-a-javascript-console

http://www.howtosolvenow.com/2014/01/log4net-example-in-c-console-application/


2015年2月6日 星期五

抽獎不重複的小程式


抽獎不重複的小程式 (測試版載點)

功能:

  • 抽獎不重複,使用System.Guid.NewGuid沒有亂數表重複問題。
  • 抽獎的結果可以讓你可以key in 工號或姓名,這功能方便會計或總務作紀錄,直接複製可以貼Excel。
  • 尾牙可以用XD



步驟簡單:

  • 可以自由設定總人數
  • 抽獎有跑動態特效
  • 得獎名單可編輯與複製貼上文字








讓你可以key in 工號或姓名,這功能方便會計或總務作紀錄,直接複製可以貼Excel




 每次抽獎都是重新搖獎,Guid.NewGuid保證亂數隨機









如果你想要完整版本,或提新需求合作
請留言
3Q






2015年2月4日 星期三

RESTful Web Services with Java



#本篇是翻譯文學(X)

RESTful Web Services with Java



J2EE  RESTful的解決方案一大堆

這次將外國人的實作教學翻成中文

自己做一遍,順便當成紀錄這樣

如果你喜歡CCR...不是... 如果你喜歡外國人的文

請直接看原文 3Q





開發環境與使用素材

1. Eclipse Kepler 
2. C:\Program Files (x86)\Java\jre7
3. jersey jersey-archive-1.17.1  (RESTful Web Services in Java.)
4. Apache Tomcat 7.0.x





在Eclipse 新增[其他]專案



選擇 dynamic web project

接著命名為RESTfulWS

那個 選阿帕契的湯姆貓第七版 然後下一步下一步完成


專案開好後

把剛剛Jersey (傑西) 下載回來的壓縮檔打開  jersey-archive-1.17.1 

裡面長這樣




lib資料夾裡面

  • asm-3.1.jar
  • jersey-client-1.17.1.jar
  • jersey-core-1.17.1.jar
  • jersey-json-1.17.1.jar
  • jersey-server-1.17.1.jar
  • jersey-servlet-1.17.1.jar
  • jsr311-api-1.1.1.jar
把這些複製貼上到專案目錄中WEB-INF -> lib

專案目錄右鍵Propertise -> Java build Path 並且加入引用




請在專案目錄中建立web.xml

/RESTfulWS/WebContent/WEB-INF/web.xml






<?xml version="1.0" encoding="UTF-8"?>
<web-app
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee"
    id="WebApp_ID"
    version="2.5">
<display-name>RESTfulWS</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.eviac.blog.restws</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>


請在專案目錄中

建立
1.package com.eviac.blog.restclient
2.class UserInfoClient.java

/RESTfulWS/src/com/eviac/blog/restclient/UserInfoClient.java

程式碼如下



package com.eviac.blog.restclient;




import javax.ws.rs.core.MediaType;




import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;




/**
*&nbsp;
* @author pavithra
*&nbsp;
*/
public class UserInfoClient {




public static final String BASE_URI = "http://localhost:8080/RESTfulWS";
public static final String PATH_NAME = "/UserInfoService/name/";
public static final String PATH_AGE = "/UserInfoService/age/";




public static void main(String[] args) {




String name = "Pavithra";
int age = 25;




ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource resource = client.resource(BASE_URI);




WebResource nameResource = resource.path("rest").path(PATH_NAME + name);
System.out.println("Client Response \n"
+ getClientResponse(nameResource));
System.out.println("Response \n" + getResponse(nameResource) + "\n\n");




WebResource ageResource = resource.path("rest").path(PATH_AGE + age);
System.out.println("Client Response \n"
+ getClientResponse(ageResource));
System.out.println("Response \n" + getResponse(ageResource));
}




/**
* Returns client response.
* e.g :&nbsp;
* GET http://localhost:8080/RESTfulWS/rest/UserInfoService/name/Pavithra&nbsp;
* returned a response status of 200 OK
*
* @param service
* @return
*/
private static String getClientResponse(WebResource resource) {
return resource.accept(MediaType.TEXT_XML).get(ClientResponse.class)
.toString();
}




/**
* Returns the response as XML
* e.g : <User><Name>Pavithra</Name></User>&nbsp;
*&nbsp;
* @param service
* @return
*/
private static String getResponse(WebResource resource) {
return resource.accept(MediaType.TEXT_XML).get(String.class);
}
}


請在專案目錄中

建立
1.package com.eviac.blog.restws
2.class UserInfo.java

/RESTfulWS/src/com/eviac/blog/restws/UserInfo.java


程式碼如下





package com.eviac.blog.restws;




import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;




/**
*
* @author pavithra
*
*/




// @Path here defines class level path. Identifies the URI path that
// a resource class will serve requests for.
@Path("UserInfoService")
public class UserInfo {




// @GET here defines, this method will method will process HTTP GET
// requests.
@GET
// @Path here defines method level path. Identifies the URI path that a
// resource class method will serve requests for.
@Path("/name/{i}")
// @Produces here defines the media type(s) that the methods
// of a resource class can produce.
@Produces(MediaType.TEXT_XML)
// @PathParam injects the value of URI parameter that defined in @Path
// expression, into the method.
public String userName(@PathParam("i") String i) {




String name = i;
return "<User>" + "<Name>" + name + "</Name>" + "</User>";
}




@GET
@Path("/age/{j}")
@Produces(MediaType.TEXT_XML)
public String userAge(@PathParam("j") int j) {




int age = j;
return "<User>" + "<Age>" + age + "</Age>" + "</User>";
}
}



在專案上按右鍵 
     run as ->run on server.



按下Finish

別驚慌

http://localhost:8080/

不是你要去的地方

請訪問

http://localhost:8080/RESTfulWS/rest/UserInfoService/name/Pavithra



http://localhost:8080/RESTfulWS/rest/UserInfoService/age/25


age這最後面參數可以自己帶

http://localhost:8080/RESTfulWS/rest/UserInfoService/age/18




2015年1月20日 星期二

Eclipse debugging “source not found.” 找不到資源,短解



找不到資源,短解


Eclipse debugging “source not found”

Source not found.



1.Clicked on the "Breakpoints" window at the bottom of the debugging screen
   開啟Breakpoints視窗

2.Right clicked "NullPointerException"
   右鍵點選NullPointerException取消勾選選單中的Caught
   或是直接取消勾選下面的Caught locations

3.Unchecked "Caught locations"
   取消勾選下面的Caught locations

Source not found.




  

2015年1月15日 星期四

使用JCL與Log4j2紀錄log



使用 JCL 與 Log4j2 紀錄 log (教學)


使用 JCL 版本為

Apache Commons Logging 1.2




使用Log4j2 版本為

Apache Log4j 2






以Eclipse來舉例:

在你的Java Project 上開啟 Properties視窗
Properties -> Java Build Path -> Libraries -> Add External JARs..

加入以下 jar 檔
  • og4j-api-2.1.jar
  • log4j-core-2.1.jar

然後在路徑 src 內新增一個XML檔,檔名 log4j2.xml

如果需要設定log的檔案名稱

經由操控檔名
可以做到

File Name format by hour
filePattern="logs/log-%d{yyyyMMdd-HH}.log"
File Name format by minute
filePattern="logs/log-%d{yyyyMMdd-HHmm}.log"
File Name format by second
filePattern="logs/log-%d{yyyyMMdd-HHmmss}.log"
File Name format by millisecond 
filePattern="logs/log-%d{yyyyMMdd-HHmmss.SSS}.log"

如果單一檔案超過10MB,檔名的i++
filePattern="logs/log-%d{yyyyMMdd-HH}~%i.log"


設定檔範例 log4j2.xml




<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <!-- Console & SYSTEM_OUT format by pattern-->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n" />
        </Console>
        <!-- DailyFile & Log file Name format by pattern-->
        <RollingFile
            name="DailyFile" fileName="logs/Teemo-log.log"
            filePattern="logs/log-%d{yyyyMMdd-HH}~%i.log">
            <PatternLayout>
                <Pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss} [%t] %c{1} - %msg%n
                </Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                <SizeBasedTriggeringPolicy size="10 MB" />
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Logger name="org.apache.log4j.xml" level="info" />
        <Root level="debug">
            <AppenderRef ref="Console" />
            <AppenderRef ref="DailyFile" />
        </Root>
    </Loggers>
</Configuration>




範例程式
package main;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class UsingLog4j2AndJCL {

 protected static Log log = LogFactory.getLog(UsingLog4j2AndJCL.class);
 
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  log.info("Hello, World!"); 
  log.error("Hello, World!");       
 }

}





相關資料可以參考

[JAVA][log4j] 詳細設定




評估xxx函式逾時,且需以不安全的方法中止。這可能使目標處理序損毀。

評估xxx函式逾時,且需以不安全的方法中止。這可能使目標處理序損毀。 我選擇直接停用 [啟用屬性評估及其他隱含函式呼叫] --------------------------- Microsoft Visual Studio -------------------...