Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > проблемы с @HandlerChain


Автор: persten 18.11.2011, 23:35
пытаюсь прикрутить SOAPHandler к веб-сервису при помощи @HandlerChain
использую для разработки netbeans 7.0 и glassfish-3.1.1:

код веб-сервиса:

Код

package ws;

import javax.jws.WebService;
import javax.jws.WebMethod;

import javax.jws.HandlerChain;


@WebService(serviceName = "ServerInfo", portName="ServerInfoPort")
@HandlerChain(file="handler-chain.xml")
public class ServerInfo {
    @WebMethod(operationName="getServerName")
    public String getServerName() 
    {
        return "test server";
    }
}



handler-chain.xml:
Код

<handler-chains xmlns="http://java.sun.com/xml/ns/javaee" 
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                xsi:schemaLocation="http://java.sun.com/xml/ns/javaee">
  <handler-chain>
    <handler>
      <handler-name>ws.SoapMessageHandler</handler-name>
      <handler-class>ws.SoapMessageHandler</handler-class>
    </handler>
  </handler-chain>
</handler-chains>


SoapMessageHandler:

Код

package ws;

import java.io.IOException;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPBody;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

import LIB.LogFile;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.OutputStream;

import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import LIB.LogFile;

public class SoapMessageHandler implements SOAPHandler<SOAPMessageContext>  {
    public String log_file_name = "";
    
    @Override
    public boolean handleMessage(SOAPMessageContext smc) {

        Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        
        
        try 
        {
            if (outboundProperty.booleanValue())
            {
                LogFile.log("outboundProperty.booleanValue()");
            }
            else
            {
                LogFile.log("outboundProperty.booleanValue() == false ");
            }
        }
        catch (Exception e) 
        {
            e.printStackTrace();            
        }    
       
        
        return outboundProperty;

    }
    
    public Set getHeaders() {
        //throw new UnsupportedOperationException("Not supported yet.");
        return null;
    }

    public boolean handleFault(SOAPMessageContext context) {
        //throw new UnsupportedOperationException("Not supported yet.");
        return true;
    }

    public void close(MessageContext context) {
    //throw new UnsupportedOperationException("Not supported yet.");
    }
}



при попытке развернуть веб-сервис glassfish выдает в логах:
SEVERE: component referenced from annotation symbol cannot be found
 symbol: javax.jws.HandlerChain
 location: class ws.ServerInfo

кто нибудь сталкивался с проблемой? помогите пожалуйста!

Автор: Kangaroo 19.11.2011, 12:25
А где лежит файл handler-chain.xml? В аннотации нужно указывать относительный путь.

Автор: persten 19.11.2011, 14:01
файл лежит там же где и ServerInfo -  в пакете ws, если я кладу его в другие места - он мне выдает что типа - не найден файл "handler-chain.xml",

а где он по идее должен лежать?

приложил проект со всеми файлами

Автор: persten 19.11.2011, 16:10
выяснил что :
SEVERE: component referenced from annotation symbol cannot be found
 symbol: javax.jws.HandlerChain
 location: class ws.ServerInfo

в принципе не влияет на работу, хендлер подключается и работает

а проблема заключалась в самом хендлере:
Код

public boolean handleMessage(SOAPMessageContext smc) {
        Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        ....
        return outboundProperty;
}


в этой функции нужно всегда возвращать true, тогда все работает как надо
Код

public boolean handleMessage(SOAPMessageContext smc) {
        Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        ....
        return true;
}


надеюсь кому то поможет

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)