【发布时间】:2017-05-29 04:11:23
【问题描述】:
我试图实现一个休息呼叫。前端获取:
[{},{}]
资源代码:
@Component
@Path(ResourcePaths.ROOT_PATH)
public class VideoResource {
@Autowired
private ReadVideoService readVideoService;
@GET
@Path(ResourcePaths.POPULAR)
@Produces({MediaType.APPLICATION_JSON})
public Response getVideo() {
ResponseBuilder responseBuilder = Response.status(Response.Status.OK);
List<Video> videos = readVideoService.getAllVideos();
//GenericEntity<List<Video>> entity = new GenericEntity<List<Video>>(videos);
//here it is able to print class info(from class member value)
System.out.println(videos.get(0).toString() +" "+ videos.get(1).toString());
return responseBuilder.entity(videos).build();
}
}
但下面的行能够打印从服务层返回的对象的信息。
System.out.println(videos.get(0).toString() +" "+ videos.get(1).toString());
所以我猜问题出在这一行:
return responseBuilder.entity(videos).build();
我也尝试过使用GenericEntity:
GenericEntity<List<Video>> entity = new GenericEntity<List<Video>>(videos);
但它会导致以下错误,我不明白 java.lang.reflect.Type 指的是什么:
Error:(37, 45) java: constructor GenericEntity in class javax.ws.rs.core.GenericEntity<T> cannot be applied to given types;
required: java.util.List<com.mondo.mondo_service.rest.model.Video>,java.lang.reflect.Type
found: java.util.List<com.mondo.mondo_service.rest.model.Video>
reason: actual and formal argument lists differ in length
这是服务层:
@Component
public class ReadVideoService {
@Autowired
public VideoDao videoDao;
public List<Video> getAllVideos() {
return videoDao.findAll();
}
}
这是 dao 对象:
@Repository
public class VideoDao extends BaseDao<Video> {
public List<Video> findAll() {
Session database = sessionFactory.openSession();
Query taskQuery = database.createQuery("select v from Video v");
List<Video> videos = taskQuery.list();
database.close();
return videos;
}
}
实体对象:
@Entity
@Table(name = "md_video")
public class Video implements Serializable{
@Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name="id")
private int id;
private String title;
private String url;
private int duration;
private String img;
private String source;
@Override
public String toString() {
return title;
}
}
-------------更新---------------
我尝试将下面一行分解为三行:
return responseBuilder.entity(videos).build();
到
responseBuilder = responseBuilder.entity(videos);
Response res = responseBuilder.build();
return res;
奇怪的是我发现在第二种情况下,当它到达return res;时,Response对象res仍然包含所有的实体信息。那为什么返回后信息会丢失呢?
【问题讨论】:
-
在返回语句中尝试
Response.ok().entity()).build(videos);。 -
试过 Response.ok().entity(videos).build();还是不行。
-
您是否尝试过放置调试器并查看响应对象的内容?
-
嗨@AmitK,我在底部有一些更新,你能再看看吗?
-
问题可能出在前端,因为响应对象包含数据,假设您直接从资源返回数据,解析时可能会在某处丢失......您还可以检查 tcp 转储并查看数据是否传递到网络?
标签: java spring hibernate spring-mvc spring-boot