Liferay PortletMVC中@Reference注解的component.name配置规则咨询
嗨,我看你正在做Liferay PortletMVC的开发,用@Reference注入MVCActionCommand的路子是对的!关于你疑惑的target = "(component.name=String.Here)"里的String.Here怎么填,我给你说清楚:绝对不能随便写个字符串就完事,它必须和你自定义的MVCActionCommand组件里声明的component.name完全一致,这样OSGi容器才能准确找到你要注入的组件。
具体怎么操作?给你举个实际例子:
先给自定义MVCActionCommand指定component.name
当你写自己的MVCActionCommand实现类时,得在@Component注解里明确设置component.name属性,这个值就是后面注入时要用到的“标识”。一般推荐用全类名来命名,这样不容易和其他组件重名,比如:@Component( immediate = true, property = { "javax.portlet.name=your_custom_portlet_name", // 你的Portlet名称 "mvc.command.name=/your/action/url/path" // 对应你Portlet里的action路径 }, component.name = "com.yourcompany.portlet.MyCustomMVCActionCommand" ) public class MyCustomMVCActionCommand extends BaseMVCActionCommand { @Override protected void doProcessAction(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception { // 在这里实现你的业务逻辑就好啦 } }这里的
component.name = "com.yourcompany.portlet.MyCustomMVCActionCommand"就是关键,记好这个值。在注入的地方填写对应的component.name
然后在你需要注入这个MVCActionCommand的类里,@Reference的target就填上面定义的那个值:@Reference( target = "(component.name=com.yourcompany.portlet.MyCustomMVCActionCommand)", unbind = "-" ) protected MVCActionCommand mvcActionCommand;
额外补充一点:
其实除了component.name,你也可以用组件的其他属性来做匹配,比如mvc.command.name,像这样:
@Reference( target = "(mvc.command.name=/your/action/url/path)", unbind = "-" ) protected MVCActionCommand mvcActionCommand;
不过用component.name的好处是更精准,万一有多个组件用了同一个mvc.command.name(虽然不推荐这么做),用component.name就能准确找到你要的那个。
要是你随便填个不存在的字符串,OSGi容器找不到对应的组件,注入就会失败,甚至可能导致你的Portlet启动不起来,所以一定要对应好哦!
内容的提问来源于stack exchange,提问作者m.irouch

