0 Replies Latest reply on May 10, 2012 10:02 AM by superDev superDev

    JAX-RS and CDI / @Provider  and  beans.xml

    superDev superDev Newbie

      I made a simple project that make use of JAX-RS (RESTfull service)

       

      I have a JAX-RS (RESTfull service) webservice project that deploys to JBoss 6.1. resteasy integrated with JSON is provided by JBoss 6.1 by default.  I wanted to change the date format of default JSON resource.

      I got some help from the Internet and added a class extends JacksonJsonProvider:

       

      http://stackoverflow.com/questions/8498413/accessing-jackson-object-mapper-in-resteasy

      http://stackoverflow.com/questions/4428109/jersey-jackson-json-date-serialization-format-problem-how-to-change-the-form

       

      @Provider
      @Produces("application/json")
      public class MyJacksonJsonProvider extends JacksonJsonProvider {
            public static final String pattern = "YYYY-MM-dd'T'HH:mm:ss";
           @Override
            public void writeTo(Object value, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String,Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {
              ObjectMapper mapper = locateMapper(type, mediaType);
              // Set customized date format
              SimpleDateFormat sdf = new SimpleDateFormat(pattern);
              mapper.getSerializationConfig().setDateFormat(sdf);
      
              super.writeTo(value, type, genericType, annotations, mediaType, httpHeaders, entityStream);
          }
      }
      

       


       

       

      This works well until I added an empty beans.xml under WebContent/WEB-INF for CDI injection.

       

      MyJacksonJsonProvider won't call, I still get default JSON date format.

       

      Even I added the following dependency under pom.xml did not help.

       

      <dependency>
                <groupId>org.jboss.resteasy</groupId>
                <artifactId>resteasy-jaxrs</artifactId>
            </dependency>
            <dependency>
                <groupId>org.jboss.resteasy</groupId>
                <artifactId>resteasy-cdi</artifactId>
                <version>2.2.1.GA</version>
            </dependency> 
      

       

       

      Does anyone have any idea why "MyJacksonJsonProvider" will be ingnored if I have an empty beans.xml under "WebContent/WEB-INF" folder? Thanks a lot in advance!

       

       

      FYI, this is the sample model class:

       

      @XmlRootElement(name = "movie")
      public class Movie {
      
          String name;
          String director;
          int year;
          Date date;
      
          @XmlElement
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          @XmlElement
          public String getDirector() {
              return director;
          }
      
          public void setDirector(String director) {
              this.director = director;
          }
      
          @XmlAttribute
          public int getYear() {
              return year;
          }
      
          public void setYear(int year) {
              this.year = year;
          }
      
          @XmlElement
          public Date getDate() {
              return date;
          }
      
          public void setDate(Date date) {
              this.date = date;
          }
      
      }
      

       

      And this is the class that produces JSON resource:

       

      @Path("/json/movie")
      public class JSONService {
      
          @GET
          @Path("/get")
          @Produces("application/json")
          public Movie getMovieInJSON() {
      
              Movie movie = new Movie();
              movie.setName("Little flower");
              movie.setDirector("Zhang Zheng");
              movie.setYear(1979);
              movie.setDate(new Date());
      
              return movie; 
      
          }
      }