2016年1月21日木曜日

PrimeFacesのrenderedをOFFにしたタグを、AJAX(update)で更新しても描画されない!!

【概要】
PrimeFacesのrenderedをOFFにしたタグを、AJAX(update)で更新しても描画されない!!

【詳細】
概要の通り。renderedに要素が空かどうかで表示非表示を切り替えようとしたが、updateで更新しても表示されない。
調べてみると、どうやらrenderedがfalesの場合、そもそもブラウザ上に表示されない。つまり、「タグも生成されない」
なので、いくらajaxで更新しても何もおこらないと・・・

update要素で存在しないIDを指定するとエラーになるがそれはあくまでfaceletのチェックのようなのでスルーされる模様。

ダメなコード
<p:fileUpload fileUploadListener="#{controller.handleFileUpload}" mode="advanced" dragDropSupport="true"
                  update="messages,buttonEffect,labelFileName" sizeLimit="100000" allowTypes="/(\.)(csv)$/"/>
    <p:panelGrid columns="2">
        <p:outputLabel value="#{disp.Name}"/>
        <p:outputLabel id="labelFileName" value="#{controller.file.fileName}" rendered="#{!empty controller.file}"/>
    </p:panelGrid>

正解サンプル
<p:panel visible="#{!empty controller.file}">
<p:outputLabel id="labelFileName" value="#{controller.file.fileName}" />
</p:panel>

PrimeFacesのpanelタグにはvisible属性があるようなので↑のようなコードであれば表示非表示を簡単に切り替えられる。
あとは、styleにdisplayかvisibleをしていするか。(true:falseで指定できないのでめんどくさいかな)

【残課題】
なし

2015年12月22日火曜日

JPAで金額を扱うぞ!ジョジョーーッ!!



Javaで金額を扱うならBigDecimalですよね。
というわけで、JPAの機能でMYSQLのDECIMAL型で定義したフィールドを持つテーブルのエンティティを自動生成したら、long型になりやがった。
ふざけんなー。

というわけで、エンティティを手動で修正したのですが、BigDecimalの場合@Sizeアノテーションが使えないことがわかりました。

調べた結果以下のようなアノテーションで範囲を定義することに。


【詳細】
@DecimalMin("0")
    @DecimalMax("99999999999")
    @Column(name = "SALES_AMOUNT", nullable = false)
    private BigDecimal salesAmount;
【残課題】
なし!

2015年12月18日金曜日

【エラー】
WELD-000054: Producers cannot produce non-serializable instances for injection into non-transient fields of passivating beans Producer: Producer Method [Logger] with qualifiers [@Any @Default] declared as [[BackedAnnotatedMethod] @Produces public com.xxx.common.cdi.LoggerProducer.createLogger()] Injection Point: [BackedAnnotatedField] @Inject com.xxx.jsf.Menu.log
【概要】
【詳細】
 
サンプルコード
a
b
c
【残課題】

2015年12月11日金曜日

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for type: java.math.BigDecimal.

【エラー】
javax.validation.UnexpectedTypeException: HV000030: No validator could be found for type: java.math.BigDecimal.
【概要】
BigDecimalフィールドのアノテーションに変なのがある。

【詳細】
sizeを指定したのがダメだったっぽい。
というわけで↓みたいにしたらエラーが消えた。

 
サンプルコード
    @DecimalMin("0") @DecimalMax("9999999") 

【残課題】
なし!

2015年12月2日水曜日

samepropertyvaluesas で 「java.lang.NoSuchFieldError: NONE」

【エラー】
java.lang.NoSuchFieldError: NONE

【概要】
hamcrestのsamepropertyvaluesas を使用すると「java.lang.NoSuchFieldError: NONE」というエラーが出力されてテストが失敗する。


【原因】
junitライブラリに含まれているhamcrestクラスと、ダウンロードしたhamcrestライブラリに含まれるクラスがは競合いる。その為(おそらく)samepropertyvaluesasが呼び出しているクラスMatcher関連?が本来呼び出すべきバージョンと違うものになっていた為エラーが発生していた。
pom.xmlのjunitに関する定義ははnetbeansで自動生成されたものを使っていたが、それだとjunitライブラリにhamcrestのクラスが一部含まれてしまう為、除外する必要がある。
もしくは、依存関係の優先度をhamcrestライブラリ⇒junitの順にすればよいはず。


【対応】
pomを以下のように修正する。

案1 junit関連より先にhamcrestの依存性を定義する。

<dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>java-hamcrest</artifactId>
            <version>2.0.0.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <!-- org.hamcrestより上にしないこと!! -->
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.8.1</version>
            <scope>test</scope>
        </dependency>


案2 hamcrestが含まれないjunitライブラリを使用する。※junitのartifactIDをjunit-depにする
<dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>java-hamcrest</artifactId>
            <version>2.0.0.0</version>
            <scope>test</scope>
        </dependency>
<!--        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.8.1</version>
            <scope>test</scope>
        </dependency>
-->
        <dependency>
            <groupId>junit</groupId>
        <!-- artifactIDがjunit-dep -->
            <artifactId>junit-dep</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>

どっちもうまくいったけど、まあ案1の方が、junit単独で使いたい時に簡単に戻せるので楽かな。



【残課題】
案1の場合、ふっと気を抜いてタグの順番を入れ替えたりしないようにしないといけない。
(忘れないようにコメントを追加しておく)

2015年11月4日水曜日

PrimeFaceのバグ? 「Cannot find component with expression ":growl" referenced from "SampleListForm:datalist:deleteButton".」

【エラー】
「Cannot find component with expression ":growl" referenced from "SampleListForm:datalist:deleteButton".」
【概要】
PrimeFacesでエンティティからJSFファイルを自動生成した時に必ず出る。
テンプレートのバグ?

growlタグを追加すれば解決

【詳細】
以下のタグを<body>タグの直下に作成する。(id="growl")

<p:growl id="growl" autoUpdate="false"/>

update要素で:growlと指定しているがこれはどこのformにも属さないgrowlを示している。
同じタグ内(formとか)の場合は「:」をつけない。
別の親タグの中に置くときは「:anotherTagId:growl」とか
<p:commandButton id="deleteButton" icon="ui-icon-trash"  value="#{bundle.Delete}" 
actionListener="#{SampleController.destroy}" 
update=":growl,datalist" 
disabled="#{empty SampleController.selected}"/> 

IDは別にgrowlでなくてもいいけど。自動生成結果とずれるので面倒

【残課題】
そもそもPrimeFacesのテンプレートを直したほうがよさそう。

java.net.BindException: Address already in use: bind

【エラー】
glassfish起動時に発生。(アプリケーションは起動した)
java.net.BindException: Address already in use: bind
【概要】
起動時に使おうとしたポートが既に別アプリにて使用中。
他のアプリを停止する。
他に動いてなくてもたまに出る?
エラーは出てもアプリケーションは起動した。
【詳細】
サンプルコード
a
b
c
【残課題】

Name XXXXXController resolves to beans CDIでNameが解決できない。

【エラー】
Exception while loading the app : CDI deployment failure:WELD-001414: Bean name is ambiguous. Name XXXXXController resolves to beans: [Managed Bean [class com.jsf.XXXXXController] with qualifiers [@Default @Named @Any], Managed Bean [class com.jsf.XXXXXController] with qualifiers [@Default @Named @Any]]
org.jboss.weld.exceptions.DeploymentException: WELD-001414: Bean name is ambiguous. Name XXXXXController resolves to beans: [Managed Bean [class com.jsf.XXXXXController] with qualifiers [@Default @Named @Any], Managed Bean [class com.jsf.XXXXXController] with qualifiers [@Default @Named @Any]]

【概要】
CDIで定義した別名が重複している!!
クラスがないはずなのに消えない!!

【対策】
glassFish(orその他WEBアプリケーションサーバー)を停止

クリーンビルド

glassfish起動

【詳細】
なし

【残課題】
なし

2015年10月30日金曜日

MySQLのデータベースの文字コードを変更する。

【エラー】
MySQLで日本語が使えない。

【概要】
データベースの文字コードを変更する。
※データベース作成時の文字コードが未指定だった為に、初期設定のlatin1になっていた。
【詳細】
○mysqlコンソールで以下のDDLを発行

ALTER DATABASE `hogehogeDB` default character set utf8;

○MySQLの設定を変更する。
my.ini
または
my.cnfを修正

[mysqld]
port   = 3306
socket = C:/Program Files/mysql/mysql.sock
character-set-server=utf8

[client]
port   = 3306
socket = C:/Program Files/mysql/mysql.sock
default-character-set=utf8

[mysql]
default-character-set=utf8



【残課題】
環境作るときにやっとかな。

【補足】
確認コマンド
status

show variables like 'character%';

PrimeFacesコンポーネントが動かない!

【エラー】
PrimeFacesが動かない!
原因はバージョンの異なるjqueryの混在。
【概要】
(参考サイト)
http://www.primefaces.org/showcase/ui/message/growl.xhtml

で書かれている通りに、ソースを書いても想定通りに動かない。
具体的にはSelectOneMenuとcalendar。
画面にコンポーネントは表示されるがコンボボックスやカレンダーがポップアップ表示で出てこない。


 【詳細】
なし
<p:calendar id="saledate" value="#{aaa.sampleDate}"></p:calendar>
<p:selectonemenu id="seriesName" value="#{aaa.selected.titleId}">
<f:selectitems itemlabel="#{title.titleName}" itemvalue="#{title.titleId}" value="#{aaa.titleMsts}" var="title">
</f:selectitems>
</p:selectonemenu>


【原因】
自分が明示的に読み込んでいるjqueryとprimeFacesが独自に読み込んでいるjqueryの
バージョンが異なっており、primeFacesのイベントがことごとく無効になっていた。

primeFacesを使うときは注意。

【残課題】
なし