JAX-RS多态POST请求:我应该如何编写JSON?

时间:2014-11-28 15:59:28

标签: java json rest jax-rs marshalling

我正在努力用JAX-RS解决这个问题,我相信它与编组/解组过程有关(我不太了解,我认为),以及我想重新创建这个:

  1. 发布帖子的REST端点是/ rest / register,所以我的服务定义如下:

    @ApplicationPath("/rest")
    public interface RestRegistration {
        @POST
        @Path("/register")
        @Produces(MediaType.APPLICATION_JSON)
        @Consumes(MediaType.APPLICATION_JSON)
        String register(UsernameRegistration usernameAccess, String network) throws RegistrationException;
    
        @POST
        @Path("/register")
        @Produces(MediaType.APPLICATION_JSON)
        @Consumes(MediaType.APPLICATION_JSON)
        String register(EmailRegistration emailAccess, String network) throws RegistrationException;
    }
    
    public class RestRegistrationImpl implements RestRegistration {
        public String register(UsernameRegistration usernameAccess, String network) throws RegistrationException {
            return "StackOverflow example: username=" + usernameAccess.getUser + ", network="+network;
        }
    
        public String register(EmailRegistration emailAccess, String network) throws RegistrationException{
            return "StackOverflow example: email=" + emailAccess.getEmail + ", network="+network;
        }
    
    }
    
  2. 它应该至少收到两条不同的JSON消息:

    { "usernameAccess" : { "user" : "AUser", "password" : "APass"}, "network" : "Facebook"}
    

    ...或

    { "emailAccess" : { "email" : "AnEmail@domain.com", "password" : "APass"}, "network" : "LinkedIn"}
    
  3. 这些类由

    表示
    public abstract class Registration {
        private Long _id; 
        private String _password; 
        private String _network;
        // usual getters and setters...
    }
    
    public class UsernameRegistration extends Registration {
        private String _user; 
        // usual getters and setters...
    }
    
    public class EmailRegistration extends Registration {
        private String _email; 
        // usual getters and setters...
    }
    
  4. 所以,我现在的问题是:

    1. 通过此实现,我一直收到HTTP 500错误。
    2. 而且我不确定如何分离两个JSON节点:usernameAccess / emailAccess和network。
    3. 另外:有什么方法可以改善使用“UsernameRegistration”和“EmailRegistration”这两个类继承相同“注册”的事实,使得“上层”1上的类看起来更优雅?< / LI>

      是否有任何参考书目,文章或如何有人可以把我交给我? 提前致谢! :)

1 个答案:

答案 0 :(得分:4)

在Jackson中,您的继承结构需要包含@JsonTypeInfo@JsonSubTypes,并为您正在注册的每个实现添加@JsonSubTypes.Type。 JsonTypeInfo将需要唯一标识符来区分类型。