【问题标题】:JAX-RS polymorphic POST request: how should I write my JSON?JAX-RS 多态 POST 请求:我应该如何编写我的 JSON?
【发布时间】:2014-11-28 15:59:27
【问题描述】:

我在尝试使用 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...
    }
    

所以,我现在的问题是:

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

有没有人可以交给我的参考书目、文章或方法? 提前致谢! :)

【问题讨论】:

  • 更新:关于我的问题的问题 2,我刚刚发现我不能以我想要的方式在一个 POST 上发送两个不同的对象。解决方案可以在这里找到:stackoverflow.com/questions/5553218/…
  • 您能否发布您收到的错误以及来自服务器的任何适用堆栈跟踪?您使用的是什么 JSON 提供程序?
  • @JohnAment:我正在使用杰克逊。错误类似于:(异常)原因:...jackson.map.JsonMappingException:无法构造 ...Registration 的实例,问题:抽象类型只能使用附加类型信息进行实例化。 (谢谢!);)

标签: java json rest jax-rs marshalling


【解决方案1】:

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

【讨论】:

  • 我同时在这里找到了它wiki.fasterxml.com/JacksonPolymorphicDeserialization(我不确定它是否会与正在解决的问题相同,但毕竟有了这个解决方案我可以管理它,即使UserRegistration/EmailRegistration 的子类)。再次感谢你,约翰。
  • 有没有办法在没有注释的情况下做到这一点?因为我依赖于我没有来源的依赖项中的模型
  • 您可以将其作为自定义 JAX-RS MessageBodyReader/MessageBodyWriter,但我会担心尝试以这种方式使用外部模型。我发现它有点像反模式,而是建议人们提出他们自己的模型表示,这些模型表示基于你自己的领域。这样,你只需要读取你关心的属性,并且封装得更好。
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
相关资源
最近更新 更多