Полиморфный POST-запрос JAX-RS: как мне написать свой JSON?

Я неудачно пытаюсь решить эту проблему с помощью 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 "Stackru example: username=" + usernameAccess.getUser + ", network="+network;
        }
    
        public String register(EmailRegistration emailAccess, String network) throws RegistrationException{
            return "Stackru 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 и сеть.
  3. Кроме того: есть ли способ, как я могу улучшить, используя тот факт, что оба класса "UsernameRegistration" и "EmailRegistration" наследуются от одной и той же "регистрации", что делает классы на "верхнем" 1. выглядят более элегантно?

Есть ли какая-нибудь библиография, статья или как кто-то может передать меня? Заранее спасибо!:)

1 ответ

Решение

В Джексоне ваша структура наследования должна включать @JsonTypeInfo а также @JsonSubTypes с @JsonSubTypes.Type для каждой реализации, которую вы регистрируете. JsonTypeInfo потребует уникальный идентификатор для дифференциации типов.

Другие вопросы по тегам