Просто найдите текст ignore: ": hidden" в файле проверки jquery и прокомментируйте его. После комментариев это никогда не потеряет никаких скрытых элементов для проверки ...
Спасибо
После компиляции исходного кода (анонимный) класс, созданный линией:
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>>
Чтобы решить эту проблему, вы сделали метод, чтобы вернуть 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) {
};
}
}
Объект ответа возвращается клиенту в ответ на запрос, отправленный на сервер. Класс 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>>() {});
findAll()
, должен передать токен, но сам метод работает без изменений. BTW, если вы абсолютно уверены , что используете толькоGenericDataResource<T>
через непараметрированные подклассы, такие какUserResource
, вы можете получить токен через отражение (восстановить 0-arity дляfindAll()
) – Raffaele 14 March 2013 в 14:09List<DAO<User>>
, поскольку вам нужно только представитьList<User>
. Поэтому вы можете обновить свойUserResource
, как я сделал в демо – Raffaele 14 March 2013 в 17:01