Just in case someone is looking for what worked on Weblogic 12.2.1.4 and CXF Servlet 2.7.11 for producing (serializing) JSON using JacksonProvider. This solution is pretty much same as above by Paul Samsotha (thanks a bunch btw!), but everything is mentioned in one place so someone as lost as I was can easily figure it out.
web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/conf/*-config.xml</param-value>
</context-param>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.myproject.common.application.ApplicationConfig</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.disableMoxyJson</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>org.codehaus.jackson.jaxrs</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
/WEB-INF/conf/app-config.xml
<bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" />
<jaxrs:providers>
<ref bean="objectMapperContextResolver" />
<ref bean="jsonProvider" />
</jaxrs:providers>
Custom ObjectMapper ContextResolver
package com.myproject.common.provider;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
import org.springframework.stereotype.Component;
@Component("objectMapperContextResolver")
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {
private final ObjectMapper mapper;
public ObjectMapperContextResolver() {
mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, false);
mapper.setSerializationInclusion(Inclusion.ALWAYS);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
}
Create App config to register JacksonFuture and custom ObjectMapperContextResolver
package com.myproject.common.application;
import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import org.glassfish.jersey.jackson.JacksonFeature;
import com.myproject.common.provider.ObjectMapperContextResolver;
@ApplicationPath("/")
public class ApplicationConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new java.util.HashSet<>();
classes.add(JacksonFeature.class);
classes.add(ObjectMapperContextResolver.class);
return classes;
}
}
Specify Jackson provider package as prefer-application-packages in weblogic-application.xml in my case, can be in web.xml:
<weblogic-application>
<prefer-application-packages>
<package-name>org.codehaus.jackson.jaxrs.*</package-name>
</prefer-application-packages>
</weblogic-application>
In the pom.xml exclude any unnecessary jersey dependency and add following org.glassfish.jersey.media jars:
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-sse -->
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-sse</artifactId>
<version>2.0-m10</version>
<exclusions>
<exclusion>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-json-jackson -->
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.0-m10</version>
</dependency>