【问题标题】:JAX-RS and CDI / @Provider and beans.xmlJAX-RS 和 CDI / @Provider 和 beans.xml
【发布时间】:2012-05-19 03:34:12
【问题描述】:

我做了一个使用 JAX-RS(RESTfull 服务)的简单项目

我有一个部署到 JBoss AS 6.1 的 JAX-RS(RESTfull 服务)Web 服务项目。与 JSON 集成的 resteasy 由 JBoss 6.1 AS 默认提供。我想更改默认 JSON 资源的日期格式。

我从网上得到了一些帮助,添加了一个扩展JacksonJsonProvider的类:

@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);
    }
}

在我在 WebContent/WEB-INF 下添加一个空 beans.xml 以进行 CDI 注入之前,这很好用。

MyJacksonJsonProvider 没有被调用,我仍然得到默认的 JSON 日期格式。

即使在 pom.xml 下添加以下依赖项也无济于事:

<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>

如果我在“WebContent/WEB-INF”文件夹下有一个空 beans.xml,有谁知道为什么 MyJacksonJsonProvider 会被忽略?提前非常感谢!

仅供参考,这是示例模型类:

@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;
    }

}

这是生成 JSON 资源的类:

@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; 

    }
}

【问题讨论】:

    标签: java jax-rs cdi


    【解决方案1】:

    我相信我也遇到过这种情况。这是一个known issue (RESTEASY-555),如果您无法将 Resteasy 升级到 >= 2.3.3.Final,解决方法是告诉 Weld 排除 MyJacksonJsonProvider,如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:weld="http://jboss.org/schema/weld/beans"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://docs.jboss.org/cdi/beans_1_0.xsd
                               http://jboss.org/schema/weld/beans http://jboss.org/schema/weld/beans_1_1.xsd">
      <weld:scan>
        <weld:exclude name="MyJacksonJsonProvider" />
      </weld:scan>
    </beans>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-11
      • 2019-03-01
      • 1970-01-01
      • 2011-03-04
      • 2013-02-15
      • 1970-01-01
      • 2015-12-16
      • 2023-01-27
      相关资源
      最近更新 更多