使用Java代码在WebSphere中创建ListenerPort报错求助
解决Java中使用ConfigService创建ListenerPort时的“invalid attribute name/type”错误
我之前在WebSphere上用ConfigService做配置的时候也踩过类似的坑,结合你提到的Jython成功、Java失败的情况,大概率是这几个细节没处理对:
1. 类型名称或属性键名的大小写/拼写问题
WebSphere的配置API对名称的大小写是严格敏感的,Jython的AdminConfig可能会做一些隐式处理,但Java的ConfigService完全是“死板”的精确匹配:
- 确认你指定的类型名是**
ListenerPort**(首字母大写,后面的Port也要大写),不能写成listenerPort或者其他变体 - 检查所有属性键名和Jython里用的完全一致,比如Jython里用
name、destinationJNDIName、listenerRef,Java里不能改成Name或DestinationJndiName这类大小写错误的键名
2. 属性值的类型不匹配
这是最容易踩的坑!Jython里可以直接传字符串名称,但Java的ConfigService要求属性值必须和WebSphere配置定义的类型严格对应:
- 比如
listenerRef属性,Jython里传监听器的字符串名称就能自动关联,但Java里必须传入对应监听器的ObjectName对象,不能传字符串 - 字符串类型的属性(比如
name、destinationJNDIName)要确保传的是String类型,不能传Object或者其他类型
3. 父对象的类型验证
你提到messageListenerService是通过queryObject获取的ObjectName,要先确认这个对象的类型确实是MessageListenerService——只有这个类型的父对象才能创建ListenerPort子对象。可以用下面的代码验证:
// 检查父对象的类型 String serviceType = messageListenerService.getKeyProperty("type"); System.out.println("MessageListenerService type: " + serviceType); // 输出应该是MessageListenerService,如果不是,说明你查错了对象
正确的Java示例代码
给你一个能正常工作的参考代码,对比下你的实现:
import com.ibm.websphere.management.configservice.ConfigService; import com.ibm.websphere.management.configservice.ConfigServiceFactory; import javax.management.ObjectName; import java.util.Hashtable; // 假设已经初始化了ConfigService,并且正确获取了messageListenerService和listenerObj(监听器的ObjectName) ConfigService configService = ConfigServiceFactory.getInstance(); // 准备ListenerPort的属性,键名和类型严格对应 Hashtable<String, Object> lpAttributes = new Hashtable<>(); lpAttributes.put("name", "MyNewListenerPort"); // String类型 lpAttributes.put("destinationJNDIName", "jms/MyTargetQueue"); // String类型 lpAttributes.put("listenerRef", listenerObj); // 必须是ObjectName类型 // 创建ListenerPort,父对象是messageListenerService,类型是ListenerPort ObjectName newListenerPort = configService.createConfigData( messageListenerService, "ListenerPort", lpAttributes ); // 别忘了保存配置,否则重启服务器后会丢失 configService.save();
快速排查步骤
- 把你Java里用的属性键名和Jython里的代码一一对比,确保完全一致
- 检查每个属性值的类型,特别是需要ObjectName的属性,不能用字符串替代
- 验证父对象
messageListenerService的类型是否正确
内容的提问来源于stack exchange,提问作者Yuvaraj Sankaran
相关产品推荐
相关产品推荐

