Actionをとってくるとき
[追記]
s2-framework-2.4.0-beta-3から上のような機能は提供されるみたい。なので下のインタフェースは不要になると思う。
ActionPathNamingRuleというインターフェースを実装しているDefaultActionPathNamingRuleを利用してAction又はActionのインターフェースをとってこようと思います。
中身は下のような感じで。
public class DefaultActionPathNamingRule implements ActionPathNamingRule { private S2Container getContainer() { return SingletonS2ContainerFactory.getContainer(); } public Class toComponentClass(ModuleConfig config, String path) { S2Container container = getContainer(); String componentName = config.getPrefix() + path; if (container.hasComponentDef(componentName)) { return container.getComponentDef(componentName).getComponentClass(); } componentName = path; if (container.hasComponentDef(componentName)) { return container.getComponentDef(componentName).getComponentClass(); } componentName = path.substring(1) + "Action"; if (container.hasComponentDef(componentName)) { Class clazz = container.getComponentDef(componentName).getComponentClass(); if (!clazz.getName().endsWith("Impl")) { return clazz; } Class[] interfaces = clazz.getInterfaces(); for (int i = 0; i < interfaces.length; i++) { if (interfaces[i].getName().endsWith("Action")) { return interfaces[i]; } } } return null; } public String toActionPathName(Class actionClass) { S2Container container = getContainer(); if (!container.hasComponentDef(actionClass)) { return null; } String componentName = container.getComponentDef(actionClass).getComponentName(); if (componentName == null) { return null; } if (componentName.startsWith("/")) { return componentName; } String result = componentName.replaceFirst("Action$", ""); return "/" + result; } }
従来のPOJO Actionの場合は、実装クラスを〜ActionImplと定義していて1つの〜Actionインターフェースを実装していれば、問題なく動くと思います。独自のルールで実装している場合は、独自のActionPathNamingRuleを作って対応するということにしたいと思います。
S2の自動登録のコンポーネント名はパッケージを"_"で区切ることになると思うので、ここで"_"を"/"に変更したりして使うのもありだと思っています。