JAX-RS и JAXB: ошибка конверсии JSON / XML с использованием GenericEntity [duplicate]

Просто найдите текст ignore: ": hidden" в файле проверки jquery и прокомментируйте его. После комментариев это никогда не потеряет никаких скрытых элементов для проверки ...

Спасибо

11
задан Nishant Kelkar 25 March 2016 в 01:17
поделиться

4 ответа

После компиляции исходного кода (анонимный) класс, созданный линией:

new GenericEntity<List<T>>(list) {}

использует переменную типа для ссылки на ее родительскую. Поскольку переменные типа не имеют значения во время выполнения, вы не можете использовать генерики, подобные этому. Вы вынуждены передавать так называемый токен типа из вызывающего сайта. Это пример, который требует, чтобы токен передавался от вызывающего абонента findAll(), но вы могли потребовать его в конструкторе и сохранить его в переменной экземпляра:

public abstract class GenericDataResource<T extends GenericModel> {
  public Response findAll(GenericEntity<List<T>> token) {
    Query query = em.createNamedQuery(modelClass.getSimpleName() + ".findAll");
    List<T> list = query.getResultList();
    return Response.ok(token).build();
  }
}

отправьте токен, как

new GenericEntity<List<User>>() {}

Если вы используете только непараметрированные подклассы, findAll() может воспользоваться отражением для создания токена (непроверенный, надеюсь, что вы получите эту идею):

@GET
@Produces(MediaType.APPLICATION_JSON)
public Response findAll() {
  Query query = em.createNamedQuery(modelClass.getSimpleName()+".findAll");
  List<T> list = query.getResultList();
  return Response.ok(new GenericEntity(list, getType())).build();
}

Вы должны реализовать getType(), чтобы вернуть желаемый тип. Это будет подкласс ParameterizedType , способный обозначать тип List<DAO<User>>

9
ответ дан Raffaele 16 August 2018 в 01:47
поделиться
  • 1
    Это Раффаэле. У меня есть класс «открытый класс UserResource расширяет GenericDataResource & lt; User & gt;». Идея состоит в том, чтобы расширить общий класс без переопределения его функций, если ожидается стандартное поведение. Я думаю, что в вашем решении каждый класс, который расширяет абстрактный класс, должен переопределить метод findAll? Любая возможность пропустить переопределение? – Emin 14 March 2013 в 14:02
  • 2
    Не нужно переопределять. Код, вызывающий findAll(), должен передать токен, но сам метод работает без изменений. BTW, если вы абсолютно уверены , что используете только GenericDataResource<T> через непараметрированные подклассы, такие как UserResource, вы можете получить токен через отражение (восстановить 0-arity для findAll() ) – Raffaele 14 March 2013 в 14:09
  • 3
    На самом деле нет метода, который явно вызывает findAll. Он вызывается через аннотации. Я редактировал вопрос, чтобы показать аннотации JAX-RS. – Emin 14 March 2013 в 14:22
  • 4
    Вы используете только подклассы non-generics? – Raffaele 14 March 2013 в 14:31
  • 5
    Я создаю полный проект, но, думаю, я сделал глупую ошибку. Нет необходимости возвращать List<DAO<User>>, поскольку вам нужно только представить List<User>. Поэтому вы можете обновить свой UserResource, как я сделал в демо – Raffaele 14 March 2013 в 17:01

Чтобы решить эту проблему, вы сделали метод, чтобы вернуть GenericEntity, а затем вызвать его из моего общего класса, например:

@XmlRootElement
public abstract class AbstractRest<T extends IEntity> {

    private Long id;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}


public abstract class SmartWebServiceNEW<R extends AbstractRest<T>> {

    @GET
    @Produces({MediaType.APPLICATION_XML})
    public Response findAll() {
        List<T> lista = getDelegate().findAll();
        if (lista == null || lista.isEmpty()) {
            return Response.status(Response.Status.NO_CONTENT).build();
        }
        List<R> retorno = new ArrayList<R>();
        for (T it : lista) {
            retorno.add(toRest(it));
        }
        GenericEntity entity = listToGenericEntity(retorno);
        return Response.ok(entity).build();
    }

    protected abstract GenericEntity listToGenericEntity(List<R> restList);   
}

@Path("/something")
@RequestScoped
public class MyEntityResource extends SmartWebServiceNEW<MyEntityExtendingAbstractRest> {

 @Override
    protected GenericEntity listToGenericEntity(List<MyEntityExtendingAbstractRest> restList) {
        return new GenericEntity<List<MyEntityExtendingAbstractRest>>(restList) {
        };
    }

}
8
ответ дан jediz 16 August 2018 в 01:47
поделиться

Объект ответа возвращается клиенту в ответ на запрос, отправленный на сервер. Класс Response имеет внутренний класс Response.ResponseBuilder, который собирает все свойства, заданные в его поле типа Response.ResponseBuilder. Response.ResponseBuilder применяет шаблон проектирования Builder для построения объекта ответа.

Метод build () отвечает за подключение цепочки объектов Response.ResponseBuilder, сформированных в ходе сборки. Например,

Response.status(200);   

возвращает метод ответа Response.ResponseBuilder после назначения объекта объекта STATUS

 Response.status(200).entity( AnyObj );

объекта присваивается сущности (возвращаемая обратная связь) типа Response.ResponseBuilder и присваивается экземпляр Response. После этого статус также присваивает статус и возвращает экземпляр Response.ResponseBuilder. Строитель соединяет их во время вызова метода build ().

Response.status(200).entity( obj ).build(); 

Наконец, метод построения конструируется полностью (со свойствами, указанными) Response.

Теперь возникает вопрос о Объект GenericEntity. Он представляет объект ответа общего типа T.

Для экземпляра,

GenericEntity> obj = new GenericEntity> (lst) {}; Response.status (200) .entity (obj) .build ();

obj - тип списка, как указано выше. метод entity принимает тип объекта, который является общим. Если возникнет необходимость в конкретном типе, вы должны передать его в качестве аргумента типа GenericEntity, с помощью которого во время выполнения он передается объекту определенного типа.

Практическое использование

Требуется для my Jersey Framework для ответа JSON типа Array, который был объектом List в моей модели Java, возвращался к клиенту как часть объекта Response.

Поэтому новый GenericEntity> --- передает объект / полезную нагрузку в тип списка new GenericEntity --- тип выполнения становится String


Ресурс на стороне Webservice

public Response findAllFruits(@QueryParam("frtID") String frtID ) {

         List<String> lst = new ArrayList<String>();
         lst.add("Banana");
         lst.add("Apple");

         GenericEntity<List<String>> obj = new GenericEntity<List<String>>(lst) {};


          return Response.status(200).entity( obj ).build(); 

    } 

Выходной ответ отправляется обратно клиенту. [«Банан», «Яблоко»]


Как читать объект ответа

List<CustomType> myObj= response.readEntity(new GenericType<List<CustomType>>() {});
0
ответ дан Yergalem 16 August 2018 в 01:47
поделиться
8
ответ дан jediz 6 September 2018 в 01:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: