jax-rs:对于返回Json的相同@Path方法,如何按设备类型进行不同的序列化

时间:2014-09-08 09:59:06

标签: java json jax-rs

简而言之: 当来自手机的请求比来自台式机的请求时,我想返回不同的JSON,比如更少的属性。


我想构建一个REST服务。 该服务将基于JPA实体提供数据。 该服务使用@Path声明。

根据User-Agent标头,我想为桌面提供比移动设备更丰富的JSON。选择要在服务器端完成。

有没有比构建第二个序列化程序更好的方法并使用条件(if(请求useragent)来调用它们(在每个方法中)并被强制返回一些String而不是任何Object(使@Produces注释未使用)

谢谢

2 个答案:

答案 0 :(得分:0)

向Path添加PathParamQueryParam以告知请求中的设备类型的一种方法是,服务可以理解设备的类型,请求是并创建适当的JSON。

请检查投票最多的SO answer,以确定请求是来自移动设备还是桌面设备,并相应地添加参数

答案 1 :(得分:0)

您可以使用jax-rs资源选择器,它将根据用户代理字符串使用不同的子资源。

@Path("api")
public UserResource getResourceByUserAgent() {
    //the if statement will be more sophisticated obviously :-)
    if(userAgent.contains("GT-I9505") {
        return new HighEndUserResource();
    } else {
        return new LowEndUserResource();
    }
}

interface UserResource {User doSomeProcessing()}

class HighEndUserResource implements UserResource {

    @Path("process")
    public User doSomeProcessing() {
        //serve 
    }        

}

class LowEndUserResource implements UserResource {

    @Path("process")
    public User doSomeProcessing() {
        //serve content for low end
    }        
}

通过调用“/ api / process”资源,响应将取决于userAgent。您还可以轻松扩展其他设备的解决方案,例如实现MiddleEndUserResource。

您可以阅读有关子资源here的更多信息: