2016-05-28 1 views
2

Итак, у меня есть следующее.Спящий режим и ответ JAX-RS с использованием HQL Выберите

У меня есть Entity, называемый GroupEntity, который имеет идентификатор groupId, name и userId, который является идентификатором, соответствующим UserEntity.

Что я хочу: Ответ JSON с группой и userentity.name. Но по какой-то причине я получаю ошибку 505 без какой-либо stacktrace.

Услуги:

public GenericEntity<List<GroupEntity>> getMyGroups() throws HibernateException { 
     session.beginTransaction(); 
     Query query = session.createQuery("FROM GroupEntity g inner join g.teacher as teacher"); 
     List<GroupEntity> groups = (List<GroupEntity>) query.list(); 
     GenericEntity<List<GroupEntity>> entity = new GenericEntity<List<GroupEntity>>(groups) {}; 

     return entity; 

    } 

JAX-RS ресурсов

@GET 
@Produces(MediaType.APPLICATION_JSON) 
public Response getMyGroups(){ 

    return Response.ok(groupService.getMyGroups(), 
      MediaType.APPLICATION_JSON) 
      .build(); 

} 

GroupEntity

@Entity 
@Table(name = "Group", schema = "pad_ijburg", uniqueConstraints = { 
     @UniqueConstraint(columnNames = "name") 
}) 

public class GroupEntity implements Serializable { 
    private int idGroup; 
    private String name; 

    @XmlTransient 
    private UserEntity teacher; 

    public GroupEntity(String name, UserEntity teacher) { 
     this.name = name; 
    } 

    public GroupEntity(){ 

    } 

    @XmlTransient 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "idUser") 
    public UserEntity getTeacher() { 
     return teacher; 
    } 

    @XmlTransient 
    public void setTeacher(UserEntity teacher) { 
     this.teacher = teacher; 
    } 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    public int getIdGroup() { 
     return idGroup; 
    } 

    public void setIdGroup(int idGroup) { 
     this.idGroup = idGroup; 
    } 

    @Basic 
    @Column(name = "name") 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

UserEntity

@Entity 
@Table(name = "User", schema = "pad_ijburg", catalog = "", uniqueConstraints = { 
     @UniqueConstraint(columnNames = "email") 
}) 
@Inheritance(strategy = InheritanceType.JOINED) 
public class UserEntity implements Serializable{ 
    private int idUser; 

    private String email; 
    private String firstName; 
    private String lastName; 
    //ToDo Make this password secure! 
    private String password; 
    private boolean admin; 
    private boolean teacher; 

    //Lists below 

    private Set<GroupEntity> teacherGroups = new HashSet<GroupEntity>(
      0); 



     public UserEntity(String email, String firstName, String lastName, String password, boolean admin, boolean teacher) { 
      this.email = email; 
      this.firstName = firstName; 
      this.lastName = lastName; 
      this.password = password; 
      this.admin = admin; 
      this.teacher = teacher; 
     } 

     public UserEntity() { 

     } 

     @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 
     @Column(name = "idUser") 
     public int getIdUser() { 
      return idUser; 
     } 

     public void setIdUser(int idUser) { 
      this.idUser = idUser; 
     } 

     @Basic 
     @Column(name = "email") 
     public String getEmail() { 
      return email; 
     } 

     public void setEmail(String email) { 
      this.email = email; 
     } 

     @Basic 
     @Column(name = "firstName") 
     public String getFirstName() { 
      return firstName; 
     } 

     public void setFirstName(String firstName) { 
      this.firstName = firstName; 
     } 

     @Basic 
     @Column(name = "lastName") 
     public String getLastName() { 
      return lastName; 
     } 

     public void setLastName(String lastName) { 
      this.lastName = lastName; 
     } 

     @Basic 
     @Column(name = "password") 
     public String getPassword() { 
      return password; 
     } 

     public void setPassword(String password) { 
      this.password = password; 
     } 

     @Basic 
     @Column(name = "admin") 
     public boolean getAdmin() { 
      return admin; 
     } 

     public void setAdmin(boolean admin) { 
      this.admin = admin; 
     } 

     @Basic 
     @Column(name = "teacher") 
     public boolean getTeacher() { 
      return teacher; 
     } 

     public void setTeacher(boolean teacher) { 
      this.teacher = teacher; 
     } 

     @OneToMany(fetch = FetchType.LAZY, mappedBy = "idGroup") 
     public Set<GroupEntity> getTeacherGroups() { 
      return teacherGroups; 
     } 

     public void setTeacherGroups(Set<GroupEntity> teacherGroups) { 
      this.teacherGroups = teacherGroups; 
     } 
    } 

Я думаю, что это как-то связано с автором тела. Проблема в том, что я действительно не знаю, как это решить.

Bodywriter ошибка:

29-May-2016 02:29:43.679 SEVERE [http-nio-8079-exec-9] org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo MessageBodyWriter not found for media type=application/json, type=class java.util.ArrayList, genericType=class java.util.ArrayList

Update:

Я установил bodywriter. Но я все равно получаю ошибку 505 (без stacktrace). Я обновил служебный код выше.

Обновление 2.0 pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 

<modelVersion>4.0.0</modelVersion> 

<groupId>org.hva.folivora</groupId> 
<artifactId>api</artifactId> 
<packaging>war</packaging> 
<version>1.0-SNAPSHOT</version> 
<name>IJBurg ReflectionAPP API</name> 

<build> 
    <finalName>api</finalName> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>2.5.1</version> 
      <inherited>true</inherited> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>org.glassfish.jersey</groupId> 
      <artifactId>jersey-bom</artifactId> 
      <version>${jersey.version}</version> 
      <type>pom</type> 
      <scope>import</scope> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

<dependencies> 
    <dependency> 
     <groupId>org.glassfish.jersey.containers</groupId> 
     <artifactId>jersey-container-servlet-core</artifactId> 
     <!-- use the following artifactId if you don't need servlet 2.x compatibility --> 
     <!-- artifactId>jersey-container-servlet</artifactId --> 
    </dependency> 

    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>4.1.0.Final</version> 
    </dependency> 

    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator-annotation-processor</artifactId> 
     <version>4.1.0.Final</version> 
    </dependency> 

    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-log4j12</artifactId> 
     <version>1.5.2</version> 
    </dependency> 

    <!-- Ensures JSON Support for the RESTAPI --> 
    <dependency> 
     <groupId>org.glassfish.jersey.media</groupId> 
     <artifactId>jersey-media-moxy</artifactId> 
    </dependency> 

    <dependency> 
     <groupId>com.owlike</groupId> 
     <artifactId>genson</artifactId> 
     <version>1.4</version> 
    </dependency> 

    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.37</version> 
    </dependency> 

</dependencies> 
<properties> 
    <jersey.version>2.22</jersey.version> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
</properties> 

Обновление 3,0

session.beginTransaction(); 
    Query query = session.createQuery("SELECT g.idGroup, g.name, teacher.idUser FROM GroupEntity g inner join g.teacher as teacher"); 
    List<Object[]> groups = (List<Object[]>) query.list(); 

    //GenericEntity<List<GroupEntity>> entity = new GenericEntity<List<GroupEntity>>(groups) {}; 

    //return entity; 

    return groups; 

Ниже будет возвращать следующий ответ JSON. Данные верны. Но он не возвращается в правильном формате.

[ 
    [ 
    3, 
    "TestGroup3", 
    3 
    ] 
] 

Заранее благодарим за вашу помощь!

+0

Трудно проанализировать вашу проблему без стека, но в качестве первого шага я попытаюсь обернуть свой список в другой объект. Посмотрите, что происходит, потому что согласно [документации] (http://docs.oracle.com/javaee/7/api/javax/ws/rs/core/Response.html#ok-java.lang.Object-javax.ws .rs.core.MediaType-) у вас есть: 'Ответственность вызывающих лиц заключается в том, чтобы обернуть фактический объект с помощью GenericEntity, если требуется сохранение его общего типа' –

+0

@JoaoEsperancinha Проблема в том, что нет ошибки stacktrace. Это известная проблема. И я думаю, что это связано с тем, что jersey-media-moxy пытается конвертировать список, но не в состоянии сделать это успешно. Проблема в том, что я не знаю, почему это не работает ... – TVH7

+0

@JoaoEsperancinha Я только что получил ошибку (к счастью) 29 мая-2016 02: 29: 43.679 SEVERE [http-nio-8079-exec-9] org.glassfish.jersey.message.internal.WriterInterceptorExecutor $ TerminalWriterInterceptor.aroundWriteTo MessageBodyWriter не найдено для типа media = application/json, type = class java.util.ArrayList, genericType = class java.util.ArrayList – TVH7

ответ

1

Хорошо, я нашел быстрое альтернативное решение для вас:

<dependency> 
    <groupId>com.owlike</groupId> 
    <artifactId>genson</artifactId> 
    <version>1.4</version> 
</dependency> 

Эта зависимость создает автоматизированную привязку данных для такого рода объектов, которые вы хотите пройти в формате JSON. В вашем случае вы хотите пройти list. Вы можете найти более подробную информацию о Genson here

+0

У меня все еще появляется ошибка 500. Просто чтобы вы знали: у меня больше нет ошибки messagebodywriter (см. Мой первоначальный пост, где я объясню, как я его исправил). Любые советы о том, как использовать генсон. Возможно, я не буду использовать его правильно. Могу ли я использовать его вместе с медиамокси? – TVH7

+0

@ TVH7 Я не понимаю, почему возникла проблема с медиа-мокси. Для Генсона вам действительно нечего делать. Он просто реализует привязки и сопоставления. Вы можете показать свой полный файл pom.xml ?. Я думаю, что у вас возникла другая проблема, потому что проблема 505 связана с ошибкой версии с протоколами HTTP между сервером и клиентом. Подробнее [здесь] (http://www.checkupdown.com/status/E505.html). И какой клиент вы используете? Если вы сделали клиент самостоятельно, убедитесь, что версии библиотеки соответствуют или обновлены до последнего. –

+0

Похоже, что это ошибка 500, а не ошибка 505. Один из моих обработчиков ошибок был неправильно настроен. – TVH7

Смежные вопросы