Перехватчики регистрации CXF

В настоящее время я регистрирую CXF, используя log4j, как указано в руководстве пользователя CXF. Но файл журнала переполняется и становится неуправляемым со всеми журналами полезной нагрузки IN / OUT.

Мне нужно регистрировать входящую полезную нагрузку SOAP только тогда, когда в качестве вывода генерируется какая-либо ошибка/исключение. Я понимаю, что потребуется написать кастомный перехватчик, но можно ли этого добиться?

Может ли кто-нибудь дать мне ссылку/подсказку или может быть какой-то пример рабочего кода?

Заранее спасибо Тиртханкар


person Tirtha    schedule 29.12.2011    source источник
comment
Кто-нибудь, пожалуйста, предложите....... Я все еще застрял!! Счастливого нового года всем.   -  person Tirtha    schedule 01.01.2012


Ответы (2)


Эта ссылка может помочь: http://www.madbit.org/blog/programming/942/how-to-log-apache-cxf-soap-request-and-response-using-log4j/#sthash.SOlB7sx6.CaTMsv3I.dpbs

Вы можете сделать это, написав собственный перехватчик и добавив ссылку на bean-компонент следующим образом в файл cxf.xml:

<bean id="customIncomingSoapFaultInterceptor"     class="com.tirtha.CustomIncomingSoapFaultInterceptor" />

<cxf:bus>

    <cxf:inFaultInterceptors>
        <ref bean="customIncomingSoapFaultInterceptor" />

    </cxf:inFaultInterceptors>

</cxf:bus>

Пример пользовательского перехватчика:

import java.io.IOException;
import java.io.InputStream;
import javax.servlet.http.HttpServletRequest;
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.cxf.binding.soap.Soap12;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.helpers.IOUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.io.CachedOutputStream;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.transport.http.AbstractHTTPDestination;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class CustomIncomingSoapFaultInterceptor extends AbstractSoapInterceptor  {

private static Log s_logger =    LogFactory.getLog(CustomIncomingSoapFaultInterceptor.class);


public CustomIncomingSoapFaultInterceptor(){

    // set phase here
    //super(Phase.PRE_PROTOCOL);
    super(Phase.RECEIVE);
}
@Override
public void handleMessage(SoapMessage message) throws Fault {
    Fault fault = null;
    String soapMessage = null;

        StringBuilder strMessage = null;    
        HttpServletRequest httpRequest = (HttpServletRequest) message.get(AbstractHTTPDestination.HTTP_REQUEST);
        if (httpRequest != null) {


             InputStream ist = message.getContent(InputStream.class);
                if (ist != null) {
                    CachedOutputStream bos = new CachedOutputStream();
                    try {
                        IOUtils.copy(ist, bos);

                        bos.flush();
                        ist.close();
                        message.setContent(InputStream.class, bos.getInputStream());
                        soapMessage = new String(bos.getBytes());//this soap message is what you want
                        bos.close();

                        s_logger.debug("Soap Message: ---------->" + soapMessage==null?"null":soapMessage);
                        s_logger.debug("String Request: ---------->" + soapMessage);


                    } catch (IOException e) {
                        throw new Fault(e);
                    }
                }



        }
}
person alamnr    schedule 02.01.2015

Вам нужен пользовательский Feature только для регистрации ошибок/исключений SOAP.

Ниже приведен исходный код метода LoggingFeature.initializeProvider(). Как видите, внутри этого метода добавляются перехватчики ошибок.

@Override
protected void initializeProvider(InterceptorProvider provider, Bus bus) {
    if (limit == DEFAULT_LIMIT && inLocation == null 
        && outLocation == null && !prettyLogging) {
        provider.getInInterceptors().add(IN);
    >>> provider.getInFaultInterceptors().add(IN);
        provider.getOutInterceptors().add(OUT);
    >>> provider.getOutFaultInterceptors().add(OUT);
    } else {
        LoggingInInterceptor in = new LoggingInInterceptor(limit);
        in.setOutputLocation(inLocation);
        in.setPrettyLogging(prettyLogging);
        in.setShowBinaryContent(showBinary);
        LoggingOutInterceptor out = new LoggingOutInterceptor(limit);
        out.setOutputLocation(outLocation);
        out.setPrettyLogging(prettyLogging);
        out.setShowBinaryContent(showBinary);

        provider.getInInterceptors().add(in);
        provider.getInFaultInterceptors().add(in);
        provider.getOutInterceptors().add(out);
        provider.getOutFaultInterceptors().add(out);
    }
}

Вы можете написать свой собственный LoggingFeature и переопределить initializeProvider следующим образом:

public class CustomLoggingFeature extends LoggingFeature {
    @Override
    protected void initializeProvider(InterceptorProvider provider, Bus bus) {
        provider.getInFaultInterceptors().add(new LoggingInInterceptor(getLimit()));
        provider.getOutFaultInterceptors().add(new LoggingOutInterceptor(getLimit()));
    }
}

Затем вы можете активировать CustomLoggingFeature следующим образом:

@WebService
@Features(classes = {CustomLoggingFeature.class})
public interface AssetServices {
}
person Halil    schedule 29.01.2015