Problem in configuring CXF for SOAP and REST logging

1

I have SOAP and REST services in my application and I have CXF configured with spring and xml to show the logging. The SOAP services show them well, but the RESTs do not. My configuration is as follows:

<cxf:bus>
    <cxf:features>
        <cxf:logging/>
    </cxf:features>
</cxf:bus>

Also, I use slf4j and this is my logback.xml file:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <appender name="SOCKET" class="ch.qos.logback.classic.net.SocketAppender">
      <RemoteHost>localhost</RemoteHost>
      <Port>4560</Port>
      <ReconnectionDelay>170</ReconnectionDelay>
      <IncludeCallerData>true</IncludeCallerData>
    </appender>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
       <encoder>
           <pattern>%date{ISO8601} |-%-5level in %logger - %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="org.springframework.beans" level="warn" />
    <logger name="org.springframework.binding" level="warn" />
    <logger name="org.springframework.jdbc" level="warn" />
    <logger name="org.springframework.transaction" level="warn" />
    <logger name="org.springframework.orm" level="warn" />
    <logger name="org.springframework.web" level="warn" />
    <logger name="org.springframework.faces" level="warn" />
    <logger name="org.springframework.webflow" level="warn" />
    <logger name="org.springframework.ldap" level="warn" />
    <logger name="org.springframework.security" level="warn" />

    <logger name="org.apache.cxf.services" level="info" />
    <logger name="org.apache.cxf.endpoint" level="info"/>

    <root level="warn">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="SOCKET"/>
    </root>

</configuration>

I've also tried creating interceptors in

<bean id="ContextInInterceptor" class="example.interceptors.ContextMessageInInterceptor"></bean>
<bean id="ContextOutInterceptor" class="example.interceptors.ContextMessageOutInterceptor"></bean>

<cxf:bus>
   <cxf:features>
      <cxf:logging/>
   </cxf:features>

   <cxf:inInterceptors>
      <ref bean="ContextInInterceptor"/>
   </cxf:inInterceptors>
   <cxf:outInterceptors>
      <ref bean="ContextOutInterceptor"/>
   </cxf:outInterceptors>
</cxf:bus>

These are the classes that represent the beans:

public class ContextMessageInInterceptor extends AbstractPhaseInterceptor<org.apache.cxf.message.Message> {

    @Autowired
    ContextJSONInInterceptor contextJSONInInterceptor;

    public ContextMessageInInterceptor() {
        super(Phase.PRE_INVOKE);
    }

    @Override
    public void handleMessage(Message message) {

        if (message instanceof XMLMessage) {
            contextJSONInInterceptor.handleMessage((XMLMessage) message);
        }else{
            if(message instanceof MessageImpl){
                if(!(message instanceof SoapMessage)){
                    contextJSONInInterceptor.handleMessage(message);
                }
            }
        }
    }
}

public class ContextMessageOutInterceptor extends AbstractPhaseInterceptor<Message> {

    @Autowired
    ContextSOAPOutInterceptor contextSOAPOutInterceptor;

    @Autowired
    ContextJSONOutInterceptor contextJSONOutInterceptor;

    public ContextMessageOutInterceptor() {
        super(Phase.WRITE);
        addBefore(SoapOutInterceptor.class.getName());
    }


    @Override
    public void handleMessage(Message message) throws Fault {
        if (message instanceof SoapMessage) {
            contextSOAPOutInterceptor.handleMessage((SoapMessage) message);
        } else {
            if (message instanceof XMLMessage) {
                contextJSONOutInterceptor.handleMessage(message);
            }else{
                if(message instanceof MessageImpl){
                    contextJSONOutInterceptor.handleMessage(message);
                }
            }
        }

    }
}

public class ContextSOAPOutInterceptor extends AbstractSoapInterceptor {

    @Autowired(required = true)
    ContextService contextService;

    public ContextSOAPOutInterceptor() {
        super(Phase.WRITE);
        addBefore(SoapOutInterceptor.class.getName());
    }

    @Override
    public void handleMessage(SoapMessage message) {
    }
}

public class ContextJSONInInterceptor
        extends AbstractPhaseInterceptor<Message> {

    @Autowired(required = true)
    ContextService contextService;

    @Autowired
    ContextJSONInInterceptor contextJSONInInterceptor;

    public ContextJSONInInterceptor() {
        super(Phase.PRE_INVOKE);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        if (message instanceof XMLMessage) {
            ContextInfo contextObj = this.contextService.getContext();
            // If no locale is set in the context, take the default one
            if (contextObj.getLocale() == null) {
                contextObj.setLocale(ConfigHelper
                        .getInstance().getConfigParameter(new ConfigId(CategoryGroupEnum.ang,
                                AngConfigCategoryEnum.LANGUAGE, AngConfigParamEnum.DEFAULT_LOCALE), "en_GB")
                        .toLowerCase());
            }
        } else {
            if (message instanceof MessageImpl) {
                System.out.println("Content-Type: " + message.get(Message.CONTENT_TYPE));
                System.out.println(message.toString());
                System.out.println("---------------");
            }
        }

    }
}

public class ContextJSONOutInterceptor extends
        org.apache.cxf.jaxrs.provider.jsonp.AbstractJsonpOutInterceptor {

    @Autowired(required = true)
    ContextService contextService;

    public static final String ANG_SECURITY_CONTEXT_KEY = "connectionToken";

    public ContextJSONOutInterceptor() {
        super(Phase.WRITE);
        addBefore(SoapOutInterceptor.class.getName());
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        System.out.println("Content-Type: " + Message.CONTENT_TYPE);
        System.out.println(message.toString());
        System.out.println("---------------");
    }

}

I do not know what I'm doing wrong. I just need the REST services to show something similar to my SOAP services:

    
asked by Caznik 10.05.2018 в 12:10
source

0 answers