【问题标题】:javax.ws.rs.core.Response build fails to retain object's informationjavax.ws.rs.core.Response 构建未能保留对象的信息
【发布时间】: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


【解决方案1】:

发现了问题,我的实体对象中没有 getter 和 setter。添加 getter 和 setter 后,实体信息会正确返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    相关资源
    最近更新 更多