2015年2月24日 星期二

[Bug] javax.persistence.EntityExistsException: a different object with the same identifier value was already associated with the session: [Model Name#index]

出現此Bug為在persistence中有已有一個Primary key相同的物件存在
若該Primary key為自動累加的流水號
需在JPA特別設定
@GeneratedValue(strategy=GenerationType.IDENTITY)

如下:
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id",length = 15)
private Integer id;

[MySQL] MySQL保留字 (Reserved Words)

有時候Query時出現錯誤訊息
像是You have an error in your SQL syntax ...SQL語法... At Line 1之類的
但語法完全正確

可以找找看是否表名或欄位名使用到了保留字

可查閱MySQL的官方參考手冊
選擇適合自己的版本,例如5.7版
保留字 (Reserved Words) 通常被放在第9章裡

Google「MySQL 保留字」也可以找到好心人士的非最新版MySQL參考手冊中文版


2015年2月9日 星期一

[Bug] java.lang.ClassNotFoundException: org.apache.tiles.web.startup.TilesListener

今天試著不要參考前輩建的環境架構
自己用maven + struts2 + tiles 架出基礎架構
 tiles是參考tutorialspoint

結果在裝tiles時遇到了這個Bug

二月 09, 2015 4:31:22 下午 org.apache.catalina.core.StandardContext listenerStart
嚴重: Error configuring application listener of class org.apache.struts2.tiles.StrutsTilesListener
java.lang.NoClassDefFoundError: org/apache/tiles/web/startup/TilesListener
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2957)
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1210)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1690)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
    at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:529)
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:511)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:139)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4888)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5467)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: org.apache.tiles.web.startup.TilesListener
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
    ... 19 more

原因在於我們在web.xml加了listener

<listener>
          org.apache.struts2.tiles.StrutsTilesListener
</listener>

呼叫的是struts2-tiles-plugin這個jar檔的StrutsTilesListener(見圖左下)
但 StrutsTilesListener又extends TilesListener(見圖右)
TilesListener應該要在tiles-core這個jar檔中(文中使用到3.0.5版),但找不到了(見圖左上)








因此

1. struts2-tiles-plugin裡沒有StrutsTilesListener的話請修改到有StrutsTilesListener的版本
應該是2.2.1以上(無求證)
我目前使用過2.3.x 都有

2. tiles-core裡沒有TilesListener請修改tiles-core的版本聽說是2.0.x可使用(無求證)
我目前使用2.0.6

3. 若將tiles-core改成2.0.6後還有其他錯誤,請再檢查tiles-api及tiles-jsp,最好都改成同一版本,因為tiles-core會呼叫tiles-api,轉去jsp頁面時會呼叫tiles-js,它們同一國的!

結論:
採用
struts2-tiles-plugin.2.2.1.jar ↑
tiles-api.2.0.6.jar
tiles-jsp-2.0.6.jar
tiles-core-2.0.6.jar
得出這個結論參考了這裡

2015年2月4日 星期三

[C#] reportViewer動態切換rdlc

還是一篇鳥蛋教學
請小心服用

若是要按某個按鈕後將reportViewer換成另一個rdlc(連dbDataSet一起換掉)

則在Click方法中寫入


// 這裡Reset reportViewer除了斷開(?)它和rdlc檔的連結,還有資料來源(dbDataSet/DataSources)的連結
reportViewer1.Reset();
// 如果是使用TableAdapters則在這裡定義
dbDataSetTableAdapters.userinfoTableAdapter ds = new dbDataSetTableAdapters.userinfoTableAdapter();
// 取得TableAdapters資料並塞成DataTable(有助於你要把它塞成資料集時系統好辦視型態)
DataTable dt = ds.GetData();
// 將要指定給reportViewer的rdlc路徑給它
// 使用ReportEmbeddedResource後rdlc名稱寫成專案名稱.XXX.rdlc即可不用寫完整路徑
reportViewer1.LocalReport.ReportEmbeddedResource = "Demo.Report2.rdlc"; 
// 指定資料集,名稱需與rdlc中的相同
reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DataSet1", dt));
reportViewer1.RefreshReport();

比較重要的是要
1.reset reportViewer
2.塞新的rdlc路徑給reportViewer
3.因為reset後DataSources也會清空也要塞新的DataSource(就不一定是TableAdapter
4. Refresh reportViewer

若你的DataSource是BeanList
可以參考這篇

[Bug] maven...not supported in -source 1.x

如果在對maven做install時,出現類似
maven strings in switch are not supported in -source 1.5
以此類推
maven balabalabalabalabala not supported in -source 1.x

但電腦環境變數設定的jdk是1.7無誤

1.檢查是否手殘以至於maven找不到JAVA_HOME
在令命提示字元裡下mvn -version觀看maven的JAVA_HOME抓到的值


若結果也是1.7無誤

2.檢查pom.xml檔
首先檢看build tag中是否有以下設定
若無則加上去
build tag是在project tag中

<build>
    <plugins>
       <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-compiler-plugin</artifactId>
           <version>2.3.1</version>
           <configuration>
               <source>1.7</source>
               <target>1.7</target>
           </configuration>
       </plugin>
    </plugins>
 </build>
另一種方法為
<properties>tag中加入

<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>