当前位置: 首页 > 知识库问答 >
问题:

Jersey REST不以Accept标头的格式返回数据

周辰沛
2023-03-14

CustomObjectResource-rest服务返回一个简单的POJO,其中包含文本、长日期和本地日期时间字段。

@Component
@Path("/resource")
public class CustomObjectResource {

    private RandomCOBuilder randomCOBuilder = new RandomCOBuilder();

    @GET
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    public Response getCustomObject(@Context HttpServletRequest httpRequest) {
        String acceptHeader = httpRequest.getHeader("Accept");//I do not use it in the code. When I debug, this param is correct.
        CustomObject customObject = randomCOBuilder.get();
        return Response
                // Set the status and Put your entity here.
                .ok(customObject)
                // Add the Content-Type header to tell Jersey which format it should marshall the entity into.
                .build();
    }
}

这是我的邮差。第-1部分接受=json状态码为200,JSON解析失败。实际上,返回的对象是XML。当我选择以XML显示结果时,

<customObject>
    <id>5</id>
    <text>CustomObject_5</text>
    <timestamp>2017-08-07 17:17:40</timestamp>
</customObject>

现在,我使用Accept:application/xml

第2部分接受xml

它没有返回任何内容:404。

我和杰克逊一起使用SpringBoot。

这是我的gradle。建筑

group 'com.ca.training.rest'
version '1.0-SNAPSHOT'

apply plugin: 'java'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile "org.springframework.boot:spring-boot-starter-jetty:1.5.3.RELEASE"
    compile "org.springframework.boot:spring-boot-starter-web:1.5.3.RELEASE"

    compile "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.8.8"
    compile "com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.8.8"

    compile 'javax.ws.rs:javax.ws.rs-api:2.0.1'
    compile "org.springframework.boot:spring-boot-starter-jersey:1.5.3.RELEASE"

    testCompile 'junit:junit:4.12'
}

CustomObject

@XmlRootElement(name = "customObject")
@JsonRootName(value = "customObject")
public class CustomObject {

    private Long id;
    private String text;

    @JsonFormat(pattern = DATE_FORMAT)
    @XmlJavaTypeAdapter(DateTimeAdapter.class)
    private LocalDateTime timestamp;

}

我正在调试。在我的代码中一切正常...但是当我进一步调试时:

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Class has two properties of the same name "timestamp"
    this problem is related to the following location:
        at public java.time.LocalDateTime com.ca.training.rest.example.core.entity.CustomObject.getTimestamp()
        at com.ca.training.rest.example.core.entity.CustomObject
    this problem is related to the following location:
        at private java.time.LocalDateTime com.ca.training.rest.example.core.entity.CustomObject.timestamp
        at com.ca.training.rest.example.core.entity.CustomObject

共有1个答案

董翰池
2023-03-14

这就是解决方案。

1)@XmlAccessorType(XmlAccessType. FIELD)以摆脱错误。否则它会从字段和getter中获取属性。

@XmlRootElement(name = "customObject")
@JsonRootName(value = "customObject")
@XmlAccessorType(XmlAccessType.FIELD)
public class CustomObject {

    private Long id;
    private String text;

    @JsonFormat(pattern = DATE_FORMAT)
    @XmlJavaTypeAdapter(DateTimeAdapter.class)
    private LocalDateTime timestamp;

    //Getters and setters
}

2) 在JerseyConfig中添加Jackson配置

@Component
public class JerseyConfig extends ResourceConfig {

    public JerseyConfig() {
        registerEndpoints();
    }

    private void registerEndpoints() {
         register(CustomObjectResource.class);
         register(JacksonConfig.class);//I need this
    }
}

3)和杰克逊配置

@Provider
public class JacksonConfig implements ContextResolver<ObjectMapper> {

    private ObjectMapper objectMapper = objectMapper();

    private ObjectMapper objectMapper() {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        objectMapper = builder.build();
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        objectMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
        objectMapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
        return objectMapper;
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {
        return objectMapper;
    }
}

现在它可以工作并以XML和JSON返回对象。

接受:应用程序/xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customObject>
    <id>2</id>
    <text>CustomObject_2</text>
    <timestamp>2017-08-08 11:49:47</timestamp>
</customObject>

接受:应用程序/json

{
    "customObject": {
        "id": 3,
        "text": "CustomObject_3",
        "timestamp": "2017-08-08 11:50:25"
    }
}
 类似资料:
  • 我似乎得到了错误的哈希值通过我的webSocket键。据我所知,套接字的客户端工作,因为当我让它连接到其他服务器时,它是成功的。 指数js 指数html 运行时密钥和哈希对的示例如下: PxsrStN1CGLK/JBYydUFjg== QAK TE6u sV705GI LpP4yKM04Y= 顶部是浏览器给出的键,底部是getAVal函数返回的值,它是不正确的,导致此消息。 WebSocket握手

  • 问题内容: 如何将Webmethod的值以JSON格式返回给客户端? 我要返回两个静态int值。 我是否需要使用这两个属性创建新对象并返回它? GetStatus()方法经常被调用,我不喜欢每次仅用于json格式创建一个特殊对象的想法。 在客户端,我在捕获返回值: 问题答案: 我只想带一个物体。它符合您的需求。如果您有两个返回值,则必须以结构化的方式将它们放在一起。

  • 问题内容: 请求中的accept-language标头通常是一个很长的复杂字符串- 例如。 有没有一种简单的方法可以在Java中解析它?还是可以帮助我做到这一点的API? 问题答案: 我建议使用让容器解析“接受语言”,而不是尝试自己管理复杂性。

  • 我很难强制S3在它从一个bucket返回的所有对象上设置CORS头,尽管启用了CORS,但由于客户端S3上传正在工作,返回的对象没有CORS头! 我启用的策略是: 对象URL示例https://s3.amazonaws.com/captionable/meme/test 有人知道怎么了吗?

  • 我是新来表达,目前如果我想发送一个回应,我会这样做 对于我所有的控制器函数,我会这样做。我想这是一种压倒性的,所以我在想是否有可能制作一个广义版本的响应。 所以经过一些搜索,我发现有两种方法可以实现这一点: 我找到了这个答案。这很清楚,但我认为这是浪费时间,我的控制器不够可读,我必须在每个控制器函数中做以下事情 这是非常有希望的,但不幸的是,经过这么多次尝试和遵循express docs,我无法让

  • 问题内容: 我正在尝试返回刚刚用Gremlin创建的Vertex(tinkerpop格式): 我得到这个例外… 如何更改代码,使其以gremlin.structure.Vertex格式而不是DSE Graph Vertex格式返回? 我在用: 我希望可以做到这一点,否则从TitanDB进行迁移将很痛苦。 问题答案: 根据我通过jira和电子邮件与Datastax Team进行的冗长讨论, 确实可以