DTOアノテーション改造記 その2
とりあえずできました。
DaoMetaDataとDaoMetaDataImplを触るだけで動きました。
DaoMetaDataは
を追加。
public String DTO_SUFFIX="_DTO";
DaoMetaDataImplは、
を追加し、createResultSetHandler内で、DTOアノテーションがある場合にResultSetHandlerを切り替えるということで対応。
/**
* DTOアノテーションのクラス取得
* @param methodName
* @return
*/
protected Class getDtoClass(String methodName) {
String key = methodName + DTO_SUFFIX;
if (daoBeanDesc_.hasField(key)) {
Field queryField = daoBeanDesc_.getField(key);
return (Class) FieldUtil.get(queryField, null);
} else {
return null;
}
}
内に切り替えロジックを挿入。
if (List.class.isAssignableFrom(method.getReturnType())) {
//DTO用ResultSetHandler
Class dtoClass = getDtoClass(method.getName());
if(dtoClass == null){
return new BeanListMetaDataResultSetHandler(beanMetaData_);
}else{
return new BeanListResultSetHandler(dtoClass);
}
}else if (isBeanClassAssignable(method.getReturnType())) {中略
//配列用に追加
} else if(dtoClass != null && Array.newInstance(dtoClass, 0).getClass()
.isAssignableFrom(method.getReturnType())){
//DTO用ResultSetHandler
return new BeanArrayResultSetHandler(dtoClass);
} else {
//DTO用ResultSetHandler
Class dtoClass = getDtoClass(method.getName());
if(dtoClass == null){
return new ObjectResultSetHandler();
}else{
return new BeanResultSetHandler(dtoClass);
}
}
これでいいのかな?
追記
配列で戻すためには、Array用のResultSetHandlerを実装する必要あり。
BeanArrayResultSetHandlerでも後で作ってみます。
public class BeanArrayResultSetHandler extends BeanListResultSetHandler {
public BeanArrayResultSetHandler(Class beanClass) {
super(beanClass);
}
public Object handle(ResultSet rs) throws SQLException {
List list = (List) super.handle(rs);
return list.toArray((Object[])Array.newInstance(getBeanClass(),list.size()));
}
}
さらに追記
これいる人いるかな?
いるならパッチ作ってみますけど。
あんまり反応ないのー