2015年6月23日火曜日

Spring Formatter for field annotation not work in Web Flow

I'd spent many hours about this problem.
that is 
field type conversion is worked, but  annotation type is not.





and no exception occured and this made the situation difficult.

finnaly i posted this article at stackoverflow.

thanks for M. Deinum it was solved immediately.

http://stackoverflow.com/questions/30973435/spring-formatter-for-field-annotation-not-work-in-web-flow



he is a writer of this book.

http://www.amazon.com/dp/1430241551


specialist of spring!

Thank you M. Deinum.

2015年6月16日火曜日

ImageMagick memo

density return is different from version

■version 6.9.1-0
$ identify -version
Version: ImageMagick 6.9.1-0 Q16 x86_64 2015-04-14 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2015 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: DPC Modules
Delegates (built-in): bzlib fontconfig freetype jng jpeg ltdl lzma png x zlib

$ identify -format "%x" 1.jpg
72    ←density

$ identify -format "%[resolution.x]" 1.jpg
72    ←density

■version 6.5.4-7
# identify -version
Version: ImageMagick 6.5.4-7 2014-02-10 Q16 OpenMP http://www.imagemagick.org
Copyright: Copyright (C) 1999-2009 ImageMagick Studio LLC

# identify -format "%x" 1.jpg
72 PixelsPerInch        ←added unit

# identify -format "%[resolution.x]" 1.jpg
    ←nothing return


2012年6月13日水曜日

JDO の detachCopy って効いてる?

JDO に detached という状態があるようなのですが、どうしてもその状態にならないので、stackoverflow で聞いてみました。

        pm.makePersistent(obj);
        System.out.println(" obj => " + JDOHelper.getObjectState(obj)); //  => (1) persistent-new
        TestModel detachedObj = pm.detachCopy(obj);
        System.out.println(" detachedObj => " + JDOHelper.getObjectState(detachedObj)); // => (2) transient .. 

(2) でdetached になって欲しいのですがそうなりません。

ObjectDBを使っています。

モデルの宣言は

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable="true")
public class TestModel{
..
}

という感じで、detachable = "true" にしているのにもかかわらずです。

なにかやらかしている可能性大ですが、勇気を出して聞いてみました。

はたしてどのような回答がつくのやら。
       

2012年3月16日金曜日


暫く日にちが経ちましたが、その間に、enumを使った crudはうまくいくようになりました。
JDOを利用したサーバ側のDAOプログラムをどうすればいいかの道筋が立って来ました。

そして、UIが少し変わりました。

そう、ボタンをつくったのと、そして、 


 ログイン画面をつくりました。
ある程度の実装も終わっています。


 ↑ここで登録をクリックすると、メールが飛んできて、
↓認証コードを入力して、登録完了です。

このログイン画面は他のアプリケーションでも使い回しができるように、作ってみました。
ちょっと作業(どちらかと言うとブログをアップする作業の方)が停滞気味ですが、次回にこのへんのソースを貼ることにします。

2012年3月12日月曜日

自社用業務システムを簡単に作ってみる AIR+BlazeDS+Spring その6

enumにトラブル発生。
これまでのプログラムで、Java+BlazeDS → AIR(Flex) の場合は、enumからテキストに変換さていましたが、AIR側からのテキストは、Javaでうまくenumとして受け取ってくれません。

ちょっと古いですが、こちらによると、
http://flexblog.faratasystems.com/2007/09/16/adding-enum-support-to-flex-amf-protocol
もともと、AMF(BlazeDSで使う通信フォーマット)は、Java1.4に対応して作られており、1.5で追加されたenumには対応していないとのこと。
このページでは、LCSD(有料版BlazeDSのようなもの)での解決策は記されていますが、BlazeDSとは別物のようでそのまま利用はできないようです。

そこで、オープンソースのwrenched http://code.google.com/p/wrenched/ というものをみつけて利用してみようとしましたが、正直使い方があまり良くわかりませんでした。

どうしようかと思っていたところ、このページにたどり着きようやく解決しました。
https://bugs.adobe.com/jira/browse/BLZ-17

単純な話、ActtionScript でもきちんと書けば enum のようになるということですな。

JobStatus.as
 [RemoteClass(alias=“jp.co.bzc.biz.xxxx.model.JobStatus”)]
 public class JobStatus
 {
  public static const 未着手:JobStatus = new JobStatus("未着手");
  public static const 着手:JobStatus = new JobStatus("着手");
  public static const 完了:JobStatus = new JobStatus("完了");
  
  public var val:String;
  public function JobStatus(v:String="unset"){
   val = v;
  }
  public function equals(other:JobStatus):Boolean{
   return other.val == val;
  }
   
  public function toString():String{
   return val;
  }
  
  public static function getAll():ArrayCollection{
   return new ArrayCollection([未着手,着手,完了]);
  }
 }


UserService.java に下記を加えます。
   static {
        PropertyProxyRegistry.getRegistry().register(Enum.class, new EnumProxy());
   } 

EnumProxyは、上記adobeのバグサイトに載っているものを使用しました。

これで、enumが使えるようになりました。
気持ちのよいプログラミングができそうです。

現在の課題は、JDOを使ったオブジェクトのアップデート(更新)です。
db4oのときもそうでしたが、同じIDを持っている別オブジェクトで「簡単に更新」するためにはどうすればいいのかが課題です。
atached detached などJDOの基本をやってみます。

2012年3月9日金曜日

自社用業務システムを簡単に作ってみる AIR+BlazeDS+Spring その5

JDOもOneToManyが必要なんだ...

OneToManyに難癖をつけて、JPAからJDOに変えましたが、JDOでもOneToManyが必要のようです。腹をくくるしかないようですね。

SiteMaking.java
@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
public class SiteMaking implements IWork,Serializable{
	private static final long serialVersionUID = -2668621914571969922L;
	@PrimaryKey
	@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
	private Long id;
	@Persistent
	@Unique
	private String name;
	@Persistent
	private Calendar deliveryDate;
	@Persistent(mappedBy = "siteMaking")
	private List jobs;
	@Persistent
	private String remark;
..

Job.java
@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
public class Job implements IJob,Serializable {
	private static final long serialVersionUID = 5763990372991734275L;
	@PrimaryKey
	@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
	private Long id;
	@Persistent
	private String name;
	@Persistent
	private Calendar startDate;
	@Persistent
	private Calendar endDate;
	@Persistent
	@Enumerated(EnumType.STRING)
	private Enum jobStatus;
	@Persistent
	private Calendar lastUpdated;
	@Persistent
	private SiteMaking siteMaking;

そして、DAOですが、前回はとりあえず保存まででしたので、もう少し書き加えてみます。
新規にお仕事を登録する際のメソッドとして、newSiteMakingPersistというものを作ってみました。

SiteMakingDAO.java
public interface SiteMakingDAO {
	public void newSiteMakingPersist(SiteMaking siteMaking);
	public List getSiteMakingNow();
}

SiteMakingDAOImpl.java 抜粋
public void newSiteMakingPersist(SiteMaking siteMaking){
        PersistenceManager pm = this.persistenceManagerFactory.getPersistenceManager();
        Transaction tx = pm.currentTransaction();
        try {
            tx.begin();
   		List list = new ArrayList();
   		for(SiteMakingJob j : SiteMakingJob.values()){
			Job job = new Job(j.toString(),siteMaking);
			list.add(job);
    	}
    	siteMaking.setJobs(list);
            pm.makePersistent(siteMaking);
            tx.commit();
        } finally {
            if (tx.isActive()) {
                tx.rollback();
            }
        }
}

クライアント側は、ジョブステータスを一覧から簡単に変えられるようにアイテムレンダラーを作成してみました。
JobItem.mxml


	
だんだんとそれっぽくなってきました。
	
	
	





2012年3月8日木曜日

自社用業務システムを簡単に作ってみる AIR+BlazeDS+Spring その4

JDOに変更する
これまで、JPAを使っていました。
情報と実装が多いのはいいことなのかもしれませんが、@OneToManyなどのなくてもいいようなアノテーションを使用する必要があります。
1対多の関係は、クラスにおいて
List<Object> obj;
などのフィールドをつくったら自明のはず。
こんな冗長に思えるアノテーションを書かなくても良いAPIや実装があるはずです。
そんな思いと過去の苦い体験があったので、@OneToManyなどのアノテーションについては、時間がかかりそうなことが発生すればすぐに他の方法に変えようと思っていました。
今回、@OneToManyと単純に書くだけでは思ったように動かないことが判明して、あっさりとJDOに移行することにしました。

application-context.xml の修正
Springの設定を変更します。
↓削除部
 
  
  
         
  
 
 
  
 
 
上記部分は削除し、代わりに、
     
        
            
                xxx
                xxx
                xxx
                xxx
            
        
    
 
        
            
        
    
 
  
  
 

 
  
 

を追加します。

を参考にしました。
これによると、アクティブトランザクション(?)を使う場合は、allowCreateをfalseにしろとあります。
With such DAOs that rely on active transactions, it is recommended that you enforce active transactions through turning off TransactionAwarePersistenceManagerFactoryProxy's allowCreate flag:
この時、例としてあげられている、DAOプログラムはこんな感じ、
        public Collection loadProductsByCategory(String category) {
        PersistenceManager pm = this.persistenceManagerFactory.getPersistenceManager();
        Query query = pm.newQuery(Product.class, "category = pCategory");
        query.declareParameters("String pCategory"); 
        return query.execute(category);
    }
これを参考に、ごく単純に、
PersistenceManager pm = this.persistenceManagerFactory.getPersistenceManager();
pm.makePersistent(obj);

としてみましたが、
No JDO PersistenceManager bound to thread, and configuration does not allow creation of non-transactional one here
というエラーが出ます。

http://forum.springsource.org/showthread.php?39628-Transactions-IllegalStateException このページをみて、allowCreate を true で行くことにしました。アクティブトランザクション(?)をやめたことになるんだと思います。

トランザクションの記述

それでも、Attempt to persist an object when no transaction is active
というエラーがでますので、DAOにトランザクションを記述しました。

        PersistenceManager pm = this.persistenceManagerFactory.getPersistenceManager();
        Transaction tx = pm.currentTransaction();
        try {
            tx.begin();
            pm.makePersistent(obj);
            tx.commit();
        } finally {
            if (tx.isActive()) {
                tx.rollback();
            }
        }
DAOの記述は、下記からになります。

実際のDAO

慣例に従い、XxxxDAO はインタフェースに変更。クラスは XxxxDAOImpl にしました。
JDOのアノテーションがうまく使えたら、もっとすっきりするかもしれません。

public interface SiteMakingDAO {
 public void persist(SiteMaking siteMaking);
}

@Componentのアノテーションはつけていません。

実装する側は、

public class SiteMakingDAOImpl implements SiteMakingDAO {
    private PersistenceManagerFactory persistenceManagerFactory;
    public void setPersistenceManagerFactory(PersistenceManagerFactory pmf) {
        this.persistenceManagerFactory = pmf;
    }
 public void persist(SiteMaking siteMaking){
        PersistenceManager pm = this.persistenceManagerFactory.getPersistenceManager();
        Transaction tx = pm.currentTransaction();
        try {
            tx.begin();
            pm.makePersistent(siteMaking);
            tx.commit();
        } finally {
            if (tx.isActive()) {
                tx.rollback();
            }
        }
 }
}

としました。@Component アノテーションはつけていません。Spring設定ファイルの記述によりインスタンス化されます。

モデルの修正

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
public class SiteMaking implements IWork,Serializable{
 private static final long serialVersionUID = 1L;
 @PrimaryKey
 @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
 private Long id;
 @Persistent
 private String name;
 @Persistent
 private List jobs;
 @Persistent
 private String remark;
 public SiteMaking(){
 }
 // 以下、セッター、ゲッター
}

JPAで使用する、@Column アノテーションを残していたらエラーが出ました。
単純に消します。