我是java的新手,我试图阅读&amp;将集合对象ArrayList<T>
写入JMS队列。我可以使用以下代码段将对象写入队列。
List<Request> reqList = new ArrayList<Request>();
... code that populates the list ...
ObjectMessage om = session.createObjectMessage((Serializable) requestList);
上面的代码部分工作正常,我可以看到JMS
队列中的记录。现在我无法从队列中回读记录,下面是代码段。
@Override
public void onMessage(Message msg)
{
try {
String msgText;
msgText = msg.toString();
List<Request> requestList = null;
requestList = msg.getBody(ArrayList<Request>);
} catch (JMSException jmse) {
System.err.println("An exception occurred: " + jmse.getMessage());
}
}
我无法完成该方法,因为我在第4行遇到错误。方法getBody需要我未能提供的类的类型。我尝试了不同的选项,例如Request[].class
,ArrayList.class
和request.getClass()
。
但他们似乎都没有工作。任何人都可以帮我指定ArrayList<T>
或List<T>
的正确类型以及如何获取它吗?
仅供参考,javax.jms
api中getBody的方法声明是
public <T extends Object> T getBody(Class<T> type) throws JMSException;
感谢您的帮助。
问候。
答案 0 :(得分:0)
尝试像这样发送;
ArrayList<Request> reqList = new ArrayList<Request>();
ObjectMessage objectMessage = session.createObjectMessage();
objectMessage.setObject(reqList);
producer.send(objectMessage);
并按如下方式阅读:
...
if (message instanceof ObjectMessage) {
Object object = ((ObjectMessage) message).getObject();
ArrayList<Request> request = (ArrayList<Request>) object);
...
如果这不起作用,请尝试创建和包含多个选项的对象,例如具有“请求列表”字段的请求。不要忘记Requests对象必须实现Seriazable。
答案 1 :(得分:0)
在语句msg.getBody(ArrayList<Request>)
中,将ArrayList<Request>
替换为List.class
。
该方法需要Class
引用,而不仅仅是类的名称。如果没有.class
后缀,ArrayList
只是类型名称,而不是类引用。这仍然会生成原始类型警告,(不幸的是)您必须使用@SuppressWarnings("rawtypes")
来抑制。
如果您发现抑制警告令人反感或无效,则有一些替代方法可以避免原始类型错误。您可以使用Serializable.class
作为正文返回类型,然后将其转换为List<Request>
。这样可以避免原始类型警告,但会导致未经检查的强制转换警告。同样,这可以通过将@SuppressWarnings("unchecked")
直接应用于正在进行赋值的局部变量(即不在方法级别)来沉默。没有压制警告就没有真正解决这个问题。