-
Type:
Bug
-
Resolution: Won't Fix
-
Priority:
Major
-
None
-
Affects Version/s: None
-
Component/s: S2Struts
-
None
-
Environment:s2-framework-2.4.0-rc-1
org.seasar.struts.pojo.util.BindingUtil#importProperty()でコンポーネント名を使ってコンポーネントを探すと、HOT deploy時にサブアプリケーションのServiceクラスのコンポーネント名がuser_LoginServiceとなっているので下記のsetterでは見つけられないようです。COOL deploy時には問題ありませんでした。
public void setLoginService(LoginService loginService)
発生する例外です。
org.seasar.framework.container.ComponentNotFoundRuntimeException: [ESSR0046]コンポーネント(loginService)が見つかりません at org.seasar.framework.container.hotdeploy.creator.MultiPackageOndemandCreator.getTargetClass(MultiPackageOndemandCreator.java:85) at org.seasar.framework.container.hotdeploy.creator.AbstractOndemandCreator.getComponentDef(AbstractOndemandCreator.java:152) at org.seasar.framework.container.hotdeploy.impl.OndemandProjectImpl.getComponentDef(OndemandProjectImpl.java:67) at org.seasar.framework.container.hotdeploy.OndemandBehavior.getComponentDef(OndemandBehavior.java:134) at org.seasar.framework.container.hotdeploy.OndemandBehavior.getComponentDef(OndemandBehavior.java:99) at org.seasar.framework.container.impl.S2ContainerBehavior$DefaultProvider.acquireFromHasComponentDef(S2ContainerBehavior.java:101) at org.seasar.framework.container.impl.S2ContainerBehavior.acquireFromHasComponentDef(S2ContainerBehavior.java:53) at org.seasar.framework.container.impl.S2ContainerImpl.hasComponentDef(S2ContainerImpl.java:409) at org.seasar.struts.pojo.util.BindingUtil.getValue(BindingUtil.java:72) at org.seasar.struts.pojo.util.BindingUtil.importProperty(BindingUtil.java:93) at org.seasar.struts.pojo.util.BindingUtil.importProperties(BindingUtil.java:82) at org.seasar.struts.pojo.MethodBinding.invoke(MethodBinding.java:65) at org.seasar.struts.pojo.MethodBindingAction.execute(MethodBindingAction.java:41) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) ...
下記のsetterだと一応動きますが、ちょっと見た目が良くないです。
public void setUser_LoginService(LoginService user_LoginService)
そこで下記のパッチのようにコンポーネント名ではなく、クラスで探すと最初のsetterで問題ありませんでした。もっと良い別の改善案があるかもしれませんが、とりあえずの案です。
org.seasar.struts.pojo.util.BindingUtil.java
Index: E:/Java/Eclipse/Workspace/Seasar/s2struts/src/main/java/org/seasar/struts/pojo/util/BindingUtil.java
===================================================================
--- E:/Java/Eclipse/Workspace/Seasar/s2struts/src/main/java/org/seasar/struts/pojo/util/BindingUtil.java (revision 556)
+++ E:/Java/Eclipse/Workspace/Seasar/s2struts/src/main/java/org/seasar/struts/pojo/util/BindingUtil.java (working copy)
@@ -63,13 +63,15 @@
return (Class) primitiveMap.get(primitiveClass);
}
- private static Object getValue(S2Container container, String name) {
+ private static Object getValue(S2Container container, Class clazz, String name) {
Object var = RequestUtil.getValue(S2StrutsContextUtil.getRequest(container), name);
if (var != null) {
return var;
}
- if (container.hasComponentDef(name)) {
+ if (container.hasComponentDef(clazz)) {
+ return container.getComponent(clazz);
+ } else if (container.hasComponentDef(name)) {
return container.getComponent(name);
}
return null;
@@ -89,8 +91,9 @@
return;
}
+ Class propertyType = propertyDesc.getPropertyType();
String propertyName = propertyDesc.getPropertyName();
- Object value = BindingUtil.getValue(container, propertyName);
+ Object value = BindingUtil.getValue(container, propertyType, propertyName);
if (BindingUtil.isActionFormProperty(propertyDesc, mapping)) {
value = ActionFormUtil.getActualForm(S2StrutsContextUtil.getRequest(container), mapping);
} else {
@@ -100,7 +103,6 @@
return;
}
- Class propertyType = propertyDesc.getPropertyType();
if (propertyType.isPrimitive()) {
propertyType = getPrimitiveWrappedClass(propertyType);
}
よろしくお願いします。