Полиморфный POST-запрос JAX-RS: как мне написать свой JSON?
Я неудачно пытаюсь решить эту проблему с помощью JAX-RS, и я считаю, что это как-то связано с процессом маршаллинга / демаршаллинга (о котором я не очень много знаю, я полагаю), и я хочу воссоздать это:
Конечной точкой 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; } }
Он должен получить как минимум два разных сообщения JSON:
{ "usernameAccess" : { "user" : "AUser", "password" : "APass"}, "network" : "Facebook"}
или же...
{ "emailAccess" : { "email" : "AnEmail@domain.com", "password" : "APass"}, "network" : "LinkedIn"}
Классы представлены
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... }
Итак, моя проблема сейчас такова:
- С этой реализацией я продолжаю получать ошибку HTTP 500.
- И я не уверен, как разделить два узла JSON: usernameAccess/emailAccess и сеть.
- Кроме того: есть ли способ, как я могу улучшить, используя тот факт, что оба класса "UsernameRegistration" и "EmailRegistration" наследуются от одной и той же "регистрации", что делает классы на "верхнем" 1. выглядят более элегантно?
Есть ли какая-нибудь библиография, статья или как кто-то может передать меня? Заранее спасибо!:)
1 ответ
В Джексоне ваша структура наследования должна включать @JsonTypeInfo
а также @JsonSubTypes
с @JsonSubTypes.Type
для каждой реализации, которую вы регистрируете. JsonTypeInfo потребует уникальный идентификатор для дифференциации типов.