【问题标题】:Jersey JSON upload failure泽西 JSON 上传失败
【发布时间】:2013-04-10 01:43:32
【问题描述】:

我有一个像这样的实体类。

@XmlRootElement
public class ImageSuffix {

    @XmlAttribute
    private boolean canRead;

    @XmlAttribute
    private boolean canWrite;

    @XmlValue;
    private String value;
}

我写的一个 JAX-RS 资源类是这样的。

@Path("/imageSuffixes")
public class ImageSuffixesResource {

    @GET
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    public List<ImageSuffix> read() {
        // ...
    }

    @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})    
    @PUT
    public void update(final List<ImageSuffix> imageSuffixes) {
        // ...
    }

    @GET
    @Path("/{name: .+}")
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    public Response readImageSuffix(@PathParam("name") final String name) {
        // ...
    }

    @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    @PUT
    @Path("/{name: .+}")
    public void updateImageSuffix(@PathParam("name") final String name,
                                  final ImageSuffix imageSuffix) {
        // ...
    }
}

这是结果

GET /imageSuffixes     in application/xml
PUT /imageSuffixes     in application/xml
GET /imageSuffixes/png in application/xml
PUT /imageSuffixes/png in application/xml

GET /imageSuffixes     in application/json
PUT /imageSuffixes     in application/json FAIL: 400
    -> The request sent by the client was syntactically incorrect (Bad Request)
GET /imageSuffixes/png in application/json
PUT /imageSuffixes/png in application/json FAIL: fields don't get values

这里是/imageSuffixes in application/json

{
    "imageSuffix": [
        {
            "$": "jpg",
            "@canRead": "true",
            "@canWrite": "true"
        },
        {
            "$": "bmp",
            "@canRead": "true",
            "@canWrite": "true"
        },
        {
            "$": "wbmp",
            "@canRead": "true",
            "@canWrite": "true"
        },
        {
            "$": "jpeg",
            "@canRead": "true",
            "@canWrite": "true"
        },
        {
            "$": "png",
            "@canRead": "true",
            "@canWrite": "true"
        },
        {
            "$": "gif",
            "@canRead": "true",
            "@canWrite": "true"
        }
    ]
}

这里是/imageSuffixes/png in application/json

{
    "$": "png",
    "@canRead": "true",
    "@canWrite": "true"
}

这是正常现象还是泽西的错?

当我依靠以下依赖时,它可以处理一些不同的 JSON 输出。

<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>2.1.4</version>
</dependency>
{
    "canRead": true,
    "canWrite": true,
    "value": "png"
}

真正的问题是 GlassFish(带球衣)不解析他(或她)打印出来的 JSON 请求。

【问题讨论】:

  • 我不确定@Path("/{name: .+}") 是否是正确的语法。你试过@Path("/name") "
  • 服务器日志中的错误信息是什么?
  • @Abraham 路径表达式没问题,我相信。
  • @Perception The request sent by the client was syntactically incorrect (Bad Request).
  • 好吧,我将假设对于您的集合 put,您传递的是内部数组(与 imageSuffix 关联的元素),因为外部结构是一个 JSON 对象。当你越过这一点时,你会遇到 JSON 中的 $ 属性无法映射到你的 POJO 的问题。

标签: json jaxb glassfish jersey jax-rs


【解决方案1】:

只需稍加改动,您的代码对我来说就可以正常工作。请注意,在您当前的配置中,您正在使用 Jackson 库来处理传入/传出的 JSON 消息。默认情况下,在反序列化数据时,Jackson 将失败,如果它遇到未知属性(即 JSON 中存在的属性,在 Java 上没有相应的属性映射)目的)。避免此错误的一种方法是使用 @@JsonIgnoreProperties 注释。

@XmlRootElement
@JsonIgnoreProperties(ignoreUnknown=true)
public class ImageSuffix {

    @XmlAttribute
    private boolean canRead;

    @XmlAttribute
    private boolean canWrite;

    @XmlValue;
    private String value;
}

在测试接受值列表的资源方法时,您似乎也发送了单个对象。确保发送一个实际的 JSON 数组:

[
    {
        "$": "jpg",
        "@canRead": "true",
        "@canWrite": "true"
    },
    {
        "$": "bmp",
        "@canRead": "true",
        "@canWrite": "true"
    }
]

最后,在您使用的任何测试客户端中,不要忘记添加请求标头Accept: application/jsonContent-Type: application/json

【讨论】:

  • 使用jackson-jaxrs-json-provider 是一种解决方法。你能解决为什么 GF(jersey) 不明白她到底印了什么吗?
  • @JinKwon - 所以你的情况是 - 当你使用从 GET 方法中检索的 JSON 并在 PUT 方法中使用它时,Jackson 不会解析它?
  • @JinKwon - 附注,您的 Jersey 部署似乎使用 Jettison 进行编组,这就是为什么您看到 @canRead@canWrite,而不是 canReadcanWrite .您是否有不想使用 Jackson 的特殊原因?
  • 不,我不是故意要使用 Jackson。是的,我的情况是一个纯粹的 G/F 不理解她的输出。
猜你喜欢
  • 2012-06-23
  • 1970-01-01
  • 2013-11-26
  • 2015-03-10
  • 2011-10-14
  • 2015-01-05
  • 1970-01-01
  • 2015-03-07
  • 2012-07-20
相关资源
最近更新 更多