【问题标题】:How to send a property as a string in RestEasy response?如何在 RestEasy 响应中将属性作为字符串发送?
【发布时间】:2014-08-29 12:08:17
【问题描述】:

我有一个名为 Product 的类,它有一个名为 id 的 long 类型的属性。下面是类

public class Product {
    private long id;
}

id 的值超出了 javascript 可以处理的值。看到下面的链接后我意识到了这一点

Parse json in javascript - long numbers get rounded

我不想在域类中将该字段声明为字符串。但我想对 RestEasy 说,它必须在 json 响应中将值作为字符串发送。

我该怎么做?我不想使用任何第三方 api。在 RestEasy 中是否有可能。我浏览了文档,但没有找到任何此类注释,或者可能是我没有正确浏览文档。

谁能帮忙。提前谢谢大家。

【问题讨论】:

    标签: web-services rest jax-ws resteasy


    【解决方案1】:

    如果您使用 Jackson 作为 JSON 序列化器,您可以扩展 JacksonJsonProvider:

    @Provider
    public class JsonProvider extends org.codehaus.jackson.JacksonJsonProvider {
    
        public JsonProvider() {
            ObjectMapper objectMapper = locateMapper(ObjectMapper.class, MediaType.APPLICATION_JSON_TYPE);
            objectMapper.configure(org.codehaus.jackson.JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS, true);
        }
    
    }
    

    如果你使用Jettison,你可以register a custom XmlAdapter

    public class LongAdapter extends XmlAdapter<String, Long> {
    
        @Override
        public String marshal(Long id) throws Exception {
            if (id == null) {
                return "";
            }
            return id.toString();
        }
    
        @Override
        public Long unmarshal(String id) throws Exception {
            return Long.parseLong(id);
        }
    
    }
    

    【讨论】:

    • 我们没有使用 Jackson api。不幸的是,我们甚至不应该使用。有没有其他办法?
    • 你使用哪个 JSON-Serializer?
    • 我们使用 jettison 序列化器
    • 谢谢。我会检查这个。同时,我在我的域类中添加了另一个方法,它将 id 作为字符串返回。所以我的域类中会有两种方法。 getIdgetIdAsLong。第一个将由 jettison 使用,第二个将由我的应用程序中的服务/类使用。我假设 jettison 将序列化属性并仅在 json 中发送 id。但它也在 json 中发送了 idAsLong。但这对我来说不是问题。现在我将介绍 jettison XmlAdapter,这似乎是一个非常有说服力的解决方案。谢谢:)
    • 只需将@XmlTransient 添加到getIdAsLong,Jettison 应该跳过此字段。
    猜你喜欢
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 2020-08-12
    相关资源
    最近更新 更多