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

Hug*_*res 2 java rest json 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;
        }
    
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 它应该至少接收两个不同的JSON消息:

    { "usernameAccess" : { "user" : "AUser", "password" : "APass"}, "network" : "Facebook"}
    
    Run Code Online (Sandbox Code Playgroud)

    要么...

    { "emailAccess" : { "email" : "AnEmail@domain.com", "password" : "APass"}, "network" : "LinkedIn"}
    
    Run Code Online (Sandbox Code Playgroud)
  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...
    }
    
    Run Code Online (Sandbox Code Playgroud)

所以,我现在的问题是:

  1. 有了这个实现,我不断收到HTTP 500错误。
  2. 而且我不确定如何分隔两个JSON节点:usernameAccess / emailAccess和network。
  3. 另外:有什么方法可以利用“ UsernameRegistration”和“ EmailRegistration”两个类都继承自相同的“ Registration”,从而使“ upper”上的类看起来更优雅吗?

是否有任何书目,文章或如何将某人交给我?提前致谢!:)

Joh*_*ent 5

在杰克逊,你的继承结构需要包含@JsonTypeInfo@JsonSubTypes@JsonSubTypes.Type每个实现的,你要注册。JsonTypeInfo将需要一个唯一的标识符来区分类型。