Deserealizer Object [resolvido]

1 resposta
raphdomn

Fala galera, sou novato por aqui.

Tenho elaborado um sistema por Java Web Start com webservices Axis2 no Tomcat, tenho um serviço que recebe um objeto serializado e devolve o mesmo serializado, no lado do cliente faço a deserialização para trabalhar com ele normalmente, isso funciona na perfeição quando se trata de uma aplicação normal java executada a partir do main() mas quando executo a partir do jnlp ele arrebenta com este erro:

java.io.EOFException
	at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2281)
	at java.io.ObjectInputStream$BlockDataInputStream.readUTFBody(ObjectInputStream.java:3019)
	at java.io.ObjectInputStream$BlockDataInputStream.readUTF(ObjectInputStream.java:2820)
	at java.io.ObjectInputStream.readString(ObjectInputStream.java:1599)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1320)
	at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
	at com.jrdevel.core.client.JRServerCommunication.desSerializer(JRServerCommunication.java:77)
	at com.jrdevel.core.client.JRServerCommunication.refresh(JRServerCommunication.java:45)
	at com.jrdevel.core.template.client.JRClientTable.execute(JRClientTable.java:27)
	at com.jrdevel.core.gui.swing.JRSwingManager.createTable(JRSwingManager.java:343)
	at com.jrdevel.core.gui.swing.JRSwingManager.createComponents(JRSwingManager.java:209)
	at com.jrdevel.core.gui.swing.JRSwingManager.run(JRSwingManager.java:138)
	at com.jrdevel.core.template.base.JRWindow.execute(JRWindow.java:51)
	at com.jrdevel.core.template.base.JRCommon.run(JRCommon.java:31)
	at com.jrdevel.pvn.main.Application.returnKey(Application.java:46)
	at com.jrdevel.core.gui.swing.JRSwingEventsManager.actionPerformed(JRSwingEventsManager.java:44)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
	at org.jdesktop.swingx.JXHyperlink.fireActionPerformed(JXHyperlink.java:266)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
	at java.awt.Component.processMouseEvent(Component.java:6263)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
	at java.awt.Component.processEvent(Component.java:6028)
	at java.awt.Container.processEvent(Container.java:2041)
	at java.awt.Component.dispatchEventImpl(Component.java:4630)
	at java.awt.Container.dispatchEventImpl(Container.java:2099)
	at java.awt.Component.dispatchEvent(Component.java:4460)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
	at java.awt.Container.dispatchEventImpl(Container.java:2085)
	at java.awt.Window.dispatchEventImpl(Window.java:2478)
	at java.awt.Component.dispatchEvent(Component.java:4460)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Só acontecendo também quando o objeto é grande, ou seja utilizo estas chamadas em várias partes da aplicação, só quando tento deserealizar um objecto que é muito grande que acontece isso.

Tentei aumentar a memória da máquina virtual que executa o jnpl com a propriedade:

<j2se version="1.6+" initial-heap-size="1024m"/>

O código que utilizo para deserealizar os objectos é:

private JRExchange desSerializer(DataHandler exchange){
		try {
			ByteArrayOutputStream buffOS= new ByteArrayOutputStream();
			exchange.writeTo(buffOS);
			byte[] buff = buffOS.toByteArray();
			ByteArrayInputStream bais = new ByteArrayInputStream(buff,0,buff.length);
			ObjectInputStream ois = new ObjectInputStream(bais);
			JRExchange exch = (JRExchange)ois.readObject();
			bais.close();
			ois.close();
			return exch;
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}

Bom é isso, precisava colocar em produção isso amanhã, se alguém ja apanhou este erro, já tentei procurar em tudo e nada de resolução.

Obrigado desde já

1 Resposta

raphdomn

Depois de um longo tempo batendo com a cabeça na parede, consegui resolver o tal problema que só acontecia via Java Web Start.

Tive de deixar de utilizar no webservices a assinatura do método com byte[] e passei a utilizar o objeto DataHandler, deixo abaixo a resolução, agora consigo enviar e receber arquivos grandes via Axis2.

Antes:

public byte[]get(byte[] obj){
}

Depois

public DataHandler get(DataHandler obj){
}

A torcida do flamengo… Aquele abraço…

Criado 16 de outubro de 2010
Ultima resposta 20 de out. de 2010
Respostas 1
Participantes 1