在Websphere Application Server v8.5中的JAX-RS中使用@JsonView(Jackson)

时间:2015-11-15 12:04:53

标签: java json rest jackson websphere

我正在构建一个必须部署在Websphere Application Server v8.5(WAS8.5)中的Rest服务。 WAS8.5使用Jackson 1.6.2作为JSON映射器。支持以下注释:

org.codehaus.jackson.annotate.JsonAnySetter
org.codehaus.jackson.annotate.JsonAutoDetect
org.codehaus.jackson.annotate.JsonClass
org.codehaus.jackson.annotate.JsonContentClass
org.codehaus.jackson.annotate.JsonCreator
org.codehaus.jackson.annotate.JsonGetter
org.codehaus.jackson.annotate.JsonIgnore
org.codehaus.jackson.annotate.JsonIgnoreProperties
org.codehaus.jackson.annotate.JsonKeyClass
org.codehaus.jackson.annotate.JsonProperty
org.codehaus.jackson.annotate.JsonPropertyOrder
org.codehaus.jackson.annotate.JsonSetter
org.codehaus.jackson.annotate.JsonSubTypes
org.codehaus.jackson.annotate.JsonSubTypes.Type
org.codehaus.jackson.annotate.JsonTypeInfo
org.codehaus.jackson.annotate.JsonTypeName
org.codehaus.jackson.annotate.JsonValue
org.codehaus.jackson.annotate.JsonWriteNullProperties
org.codehaus.jackson.map.annotate.JsonCachable
org.codehaus.jackson.map.annotate.JsonDeserialize
org.codehaus.jackson.map.annotate.JsonSerialize
org.codehaus.jackson.map.annotate.JsonTypeIdResolver
org.codehaus.jackson.map.annotate.JsonTypeResolver
org.codehaus.jackson.map.annotate.JsonView

在我的代码中,我想使用JsonView注释。下一个代码示例解释了我想要完成的任务。

POJO:

public class SomeObject {
    @JsonView(SomeObjectView.Details.class)
    private String somePropOne;

    private String somePropTwo;
    ...
}

查看界面:

public interface SomeObjectView {
    public interface Details{}
}

休息控制器:

@Stateless
@Path("/someobjects")
public class SomeObjectRestController {
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("{id}")
    @JsonView(SomeObjectView.Details.class)
    public SomeObject getPolis(@PathParam("id") String id) {
        SomeObject someObj = ... // Service call
        return someObj;
    }
}

在上面的例子中,Rest Controller中的@JsonView似乎没有效果(两个属性都显示在JSON响应中)。可能是Websphere的JAX-RS实现对Rest端点上的注释没有任何作用。

有什么方法可以让它发挥作用吗?

1 个答案:

答案 0 :(得分:0)

第二个属性序列化,因为它是"无视图"属性:

"默认情况下,所有没有显式视图定义的属性都包含在序列化中。 "

您可以通过以下方式进行更改:

objectMapper.configure(SerializationConfig.Feature.DEFAULT_VIEW_INCLUSION, false);

不要忘记注释您不需要的属性(我使用静态类):

class SomeObjectView {
    static class Details{}
    static class UnWantedDetails{}

}
public class SomeObject {
    @JsonView(SomeObjectView.Details.class)
    private String somePropOne;

    @JsonView(SomeObjectView.UnWantedDetails.class)
    private String somePropTwo;
    ...
}

Reference