0

i ve migrate a web application from weblogic 12c and jdk1.7 to weblogic 14c and jdk1.8. The web application use jax-re for rest services and has the following custom JacksonContextProvider for mapping json:

package eu.sia.mdp.backoffice.common;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.TimeZone;

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.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;

/**
 * ObjectMapper settings
 *
 * @author g.palladino
 *
 */
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class JacksonContextResolver implements ContextResolver<ObjectMapper> {
    private final ObjectMapper objectMapper;
    
    private static final Logger log = LoggerFactory.getLogger( JacksonContextResolver.class );
    
    public JacksonContextResolver() {
        this.objectMapper = new ObjectMapper().setSerializationInclusion(Include.NON_NULL);
//      DATEFORMAT DF = NEW SIMPLEDATEFORMAT("YYYY-MM-DD HH:MM:SS.SSSZ");
//      this.objectMapper.setDateFormat(df);
        this.objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);        
        this.objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        this.objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT,true);        
        this.objectMapper.getSerializationConfig().getDateFormat().setTimeZone(TimeZone.getTimeZone("CET"));    
    }

    @Override
    public ObjectMapper getContext(Class<?> objectType) {
        
        return null;
    }
}

the application, for the webservices, use the jax-rs 2.0.1 and jersey 2.29 provided by server weblogic 14.1.1 (14c). In version built with jdk1.7 and deployed on server weblogic 12c the libraries was not provided by the server but put in pom file without scope provided and the custom ContextResolver was worked fine. Now, with provided libraries, the custom ContextResolver is completely ignored and the webservices return json in a format that is not as i want, for example the dates was in the format 'yyyy-MM-ddTHH:mm:ss.SSSZ' (2022-12-16T11:33:21.123 0100' and now I receive the dates in the format 'yyyy-MM-ddTHH:mm:ss.SSSZ [UTC]' (2022-12-16T11:33:21.123Z [UTC]) and if pass this date to a rest service in my application i have the type mismatch error. Seems that is used the server's ObjectMapper. could someone help me figure out how to configure the weblogic.xml and/or web.xml files to pass the jax-rs and jersey libraries without provided scope in order to then use the custom ObjectMapper in the class JacksonContextResolver implements ContextResolver ObjectMapper and not the server ObjectMapper???

the current server is Weblogic 14.1.1.

pom file:

<!-- JAX-RS -->
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.0.1</version>
            <scope>provided</scope>
        </dependency>
        
        <!--<dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.1.1</version>
            <scope>provided</scope>
        </dependency>-->

        <!-- CDI -->
        <dependency>
            <groupId>javax.enterprise</groupId>
            <artifactId>cdi-api</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- Jersey -->
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>${jersey.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-server</artifactId>
            <version>${jersey.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-client</artifactId>
            <version>${jersey.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-moxy</artifactId>
            <version>${jersey.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>${jersey.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.ext</groupId>
            <artifactId>jersey-bean-validation</artifactId>
            <version>${jersey.version}</version>
            <scope>provided</scope>
        </dependency>

web.xml

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

<web-app version="3.0" 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 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    metadata-complete="false">

    <servlet>
        <servlet-name>jersey-serlvet</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>eu.sia.mdp.backoffice</param-value>
        </init-param>
        <init-param>
            <param-name>jersey.config.server.provider.classnames</param-name>
            <param-value>com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider</param-value>
        </init-param>
       <init-param>
            <param-name>jersey.config.server.tracing</param-name>
            <param-value>ALL</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>jersey-serlvet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>

    <mime-mapping>
        <extension>json</extension>
        <mime-type>application/json</mime-type>
    </mime-mapping>

    <resource-ref>
        <description>Database MP</description>
        <res-ref-name>jdbc/MPDB</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>
</web-app>

weblogic.xml

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app xmlns="...">

   <container-descriptor>

      <prefer-application-packages>
         <package-name>org.slf4j.*</package-name>
         <package-name>org.apache.commons.logging.*</package-name>
         <package-name>com.sun.jersey.*</package-name>
        <!--<package-name>org.glassfish.jersey.*</package-name>
         <package-name>org.glassfish.hk2.*</package-name>-->
         <package-name>org.jvnet.hk2.*</package-name>
         <!--<package-name>jersey.repackaged.org.objectweb.asm.*</package-name>-->
         <package-name>org.objectweb.asm.*</package-name>
         <package-name>com.sun.ws.rs.ext.*</package-name>
         <!--<package-name>javax.ws.rs.*</package-name>
         <package-name>javax.validation.*</package-name>-->
         <package-name>org.hibernate.validator.*</package-name>
      </prefer-application-packages>

      <prefer-application-resources>
         <resource-name>org/slf4j/impl/StaticLoggerBinder.class</resource-name>
         <resource-name>org.hibernate.validator.*</resource-name>
         <resource-name>javax.validation.*</resource-name>
      </prefer-application-resources>

   </container-descriptor>

   <context-root>mdp-portale-bo</context-root>

   <library-ref>
      <library-name>jax-rs</library-name>
      <specification-version>2.0</specification-version>
      <exact-match>false</exact-match>
   </library-ref>

    <resource-description>
        <res-ref-name>jdbc/MDPDB</res-ref-name>
        <jndi-name>jdbc/MDPDB</jndi-name>
    </resource-description>

</weblogic-web-app>

Thanks

  • With the ContextResolver, you would do the same thing, exception changing the package on the ObjectMapper (from codehaus to fasterxml). All in your weblogic file, you should no long use com.sun.jersey, it should be org.glassfish.jersey. Also it's best to register the JacksonFeature instead of JacksonJsonProvider – Paul Samsotha Dec 16 '22 at 17:31
  • @PaulSamsotha without scope on the dependencies i can't deploy web application on server weblogic 14c. I receive the tihs error: java.lang.ClassCastException: weblogic.jaxrs.server.media.multipart.Jersey1MultiPartSupport cannot be cast to org.glassfish.jersey.internal.spi.AutoDiscoverable that i don't know what it means. If i put scope i have disable all packages relative to jersey jars in beacause the jars are not in the war and when i do a call i receive the result in the wrong format. – pietro laforgia Dec 19 '22 at 08:23

0 Answers0