Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

jta-data-source名に__pmが付けられてエラーとなる

これ、ハマってる方がいるのかわからないのですが、自分は結構ハマったのでメモ。

手元の環境は

Windows 8 Pro(64bit)
JDK 7u67
NetBeans 8.0.1
GlassFish 4.1

で、Java DB(Derby)のテーブルからNetBeansの自動生成機能でエンティティ・クラス作ったりしたアプリをデプロイしたとき

重大: Exception while preparing the app : Invalid resource : MemoJNDI__pm
com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Invalid resource : MemoJNDI__pm
at org.glassfish.jdbcruntime.service.JdbcDataSource.validateResource(JdbcDataSource.java:81)
at org.glassfish.jdbcruntime.service.JdbcDataSource.setResourceInfo(JdbcDataSource.java:62)
at org.glassfish.jdbcruntime.JdbcRuntimeExtension.lookupDataSourceInDAS(JdbcRuntimeExtension.java:136)
…略

みたいなエラーでこけてしまう。うーん、今まであまりなったことなかったのに…と。

自動生成されたpersistence.xmlのjta-data-sourceは

<persistence-unit name="sample.javaee_MemoApp_war_1.0PU" transaction-type="JTA">
    <jta-data-source>MemoJNDI</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties/>
</persistence-unit>

となっていて「__pm」なんてつけてないんだけど…??みたいな。

ググると海外情報では同じエラーの人が多々いて、回答みてやってみたりもしたけど、ダメでした。


java - Glassfish can not find JNDI DataSource while deploying - Stack Overflow


java - JNDI resource name appended with _pm . Deployment fails . - Stack Overflow


java - Glassfish Server Error when deploy .war: Error occurred during deployment: Exception while preparing the app : Invalid resource - Stack Overflow

http://www.nagazuka.nl/2014/03/invalid-resource-with-netbeans-8_27.html

というか、GlassFish3.1.2.2とかNetBeans7.3でもなってるっぽい。自分はなったことないのだが。。。

で、ドメインを作り直すと、普通に動くようになりました。
前に@megascusさんが以下ブログでパスワードの所で注意、とあって、一番下にドメイン作り直し、というをやってみた感じ。


#JJUG_CCC Java EE 7 HoL補足 - 水まんじゅう

NetBeansのサーバ追加で新しくGlassFish4.1を食わせなおしただけですが。

f:id:kikutaro777:20140915165534j:plain

デフォルトで作られるドメインが駄目なのかなぁ。domain.xmlとか細かく見比べてみないと。

NetBeansで自動生成されるglassfish-resources.xmlでJDBCのconnection-poolやresourceを定義するのではなく、GlassFishの管理コンソールで手動作成すればいけるとも書いてありましたが、まだ試してないです。

GlassFish 4.1とNetBeans 8.0.1が出た!

タイトルの通り、GlassFish4.1がリリースされました!

はやくも@Denさんがブログ書かれてた(^^;

GlassFish4.1リリース! - DENの思うこと

GlassFishの4系はバージョン体系が4.0.1だったのですが、正式版になって4.1と変わっています。

この体系に関してはGlassFish Users Group Japanの副会長である蓮沼さんが以前にブログで書かれてるので以下参照下さい。


GlassFish 4.0.1 改め GlassFish 4.1 - GlassFish Japan

また、GlassFish4.1に合わせた形でNetBeans8.0.1がリリースされています。
もちろんGlassFish4.1がバンドルされています。

NetBeans 8.0.1での主な変更点は以下サイトにありますが、RequireJSとかKarmaとかNode.JS Bower Gruntなどが並んでる辺り、JavaScript系の強化なんでしょうかね。


NetBeans IDE 8.0.1 Release Information

あとは最新のPrimeFacesがバンドルされたことと

標準でWildFlyがサポートされた!!(前まではプラグイン入れないとダメでした)

f:id:kikutaro777:20140910202506j:plain

うーむ、このままWildFlyも勢いが出てきそうな。

最後に、個人的には以下はそろそろ消してもいいような…ボソリ

f:id:kikutaro777:20140910202654j:plain

SendGrid Parse WebhookでPOSTしたメール内容をvoicetext4jで音声読み上げしてみた

こんなもの作って遊んでみました↓


SendGrid Parse Webhook with voicetext4j - YouTube

受信したメール内容を音声で読み上げるだけなんですが(^^;

先日のJJUGで@makingさんがLTで紹介されたVoiceText Web APIと、それを簡単にJavaで使えるvoicetext4jライブラリが印象的で、色々遊べそうだよなぁと。

で、SendGridが提供しているParse Webhook使ったら面白そうかなぁと。

単純にPOSTされたメール内容をvoicetext4jで読み上げるだけなのですが(^^;

ちなみにSendGridのParse Webhookについては以下に詳細がのってます。

Parse Webhookテクニカルガイド【入門】 | ブログ | SendGrid

POST先のサーバどうしよう…と思ったら、上記の記事で自分のローカルにトンネルする方法まで書いてあった(^^;;
ということで、ngrok使ってみました。

ngrok - secure introspectable tunnels to localhost

サーバはJava EE使うまでもない…ということで、Spark使いました(^^;

Sparkは前にちょっとだけ試してました。

Java 8でSpark 2.0.0が楽しそう - Challenge Java EE !

コードはかなりテキトー(^^; StreamAPI使って綺麗に書きたかったけど、リファクタは後で…。

package jp.co.sample.voicereadingfrommail;
import am.ik.voicetext4j.EmotionalSpeaker;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.util.Streams;
import static spark.Spark.*;

/**
 * SendGrid Parse Webhookでpostしてメール内容を音声読み上げする.
 * 
 * @author kikuta
 */
public class App {
    public static void main(String[] args) {
        //voicetext用のキー(登録するとメールで送られてきます)
        System.setProperty("voicetext.apikey", "****************");
        
        //ポート
        setPort(8080);
        
        //SendGridからPOSTデータを受信
        post("/", "plain/text", (req, res) -> {
            ServletFileUpload parse = new ServletFileUpload();
            FileItemIterator itm;
            try {
                itm = parse.getItemIterator(req.raw());
                while(itm.hasNext()){
                    FileItemStream stream = itm.next();
                    if(stream.isFormField()){
                        String str = Streams.asString(stream.openStream(), "iso-2022-jp");
                        if(stream.getFieldName().equals(("text"))){
                            EmotionalSpeaker.HARUKA.ready()
                                .pitch(100)
                                .speed(100)
                                .happy()
                                .speak(str);
                        }
                    }
                }
            } catch (FileUploadException | IOException ex) {
                Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
            }
            return req.body();
        });
    } 
}

SendGridのブログではPOSTされるデータがJSONぽく書いてありますが、実際にはファイルアップロードなどでformをPOSTするときのmultipart/form-dataの形式でデータが来ました。
なのでサンプルではApache Commons Uploadを使ってます(^^;

にほんブログ村 IT技術ブログへ
にほんブログ村
にほんブログ村 IT技術ブログ Javaへ
にほんブログ村
QLOOKアクセス解析