当前位置: 首页 > 知识库问答 >
问题:

ClientResponse.get实体(String.class)返回超文本标记语言而不是JSON

穆俊杰
2023-03-14

我试图通过泽西客户端的Web服务获取一个对象,通过发送预注册ID作为路径变量的服务,在高级REST客户端和邮递员上测试它-它的工作原理,但当我通过泽西客户端从java代码使用Web服务时,我得到超文本标记语言返回而不是JSON。

这是密码

Web服务-

@GET
@ResponseBody
@RequestMapping("/userJSON2/{preRegisterId}")
public PreRegisterJsonResponse userJson2(@PathVariable long preRegisterId){
    PreRegisterJsonResponse pjr = new PreRegisterJsonResponse();
    try{
        PreRegister preRegUser = preRegisterDao.get(preRegisterId);
        pjr.setFirstName(preRegUser.getFirstName());
        pjr.setMiddleName(preRegUser.getMiddleName());
        pjr.setLastName(preRegUser.getLastName());
        pjr.setLoginId(preRegUser.getLoginId());
        pjr.setRoleId(preRegUser.getRole().getId());
        pjr.setUrlCode(preRegUser.getUrlCode());
        pjr.setCreatedBy(preRegUser.getCreatedBy().toString());
        if(preRegUser.getInvitedUnder() != null){
            pjr.setInvitedUnderId(preRegUser.getInvitedUnder().getId());
        }else{
            pjr.setInvitedUnderId(0);
        }
        pjr.setSkipBiometrics(preRegUser.isSkipBiometrics());
        pjr.setMainRecordOfficer(preRegUser.getMainRecordOfficer());
        pjr.setEmployeeId(preRegUser.getEmployeeId());
        if(preRegUser.getFond() != null){
            pjr.setFondId(preRegUser.getFond().getId());
        }else{
            pjr.setFondId(0);
        } 
    } catch(Exception ex){
        logger.error("Exception in WebServiceController:userJson2() "+ex.getMessage());
    }

    return pjr;
}

泽西客户-

    public static void getInvitedUser(){
    try{
        Gson gson = new Gson();
        Client client = Client.create();
        WebResource webResource = client.resource("http://localhost:8080/webApplication/rest/UserJSON2/"+preRegisterId);
        ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);

        if (response.getStatus() != 200) {
           throw new Exception("Exception in getInvitedUser() : "+ response.getStatus());
        }

        String output = response.getEntity(String.class);
        System.out.println("Output from Server .... \n");
        System.out.println(output);
        preRegisterUser = gson.fromJson(output, PreRegister.class);
    }catch(Exception ex){
        ex.printStackTrace();
    }
    }

通过邮递员和ARC消费web服务后-

{
"firstName": "fname",
"middleName": null,
"lastName": "lname",
"loginId": "mith11395@gmail.com",
"roleId": 4,
"urlCode": "1c5f8f37dfb1483db1d694d82fbdcae5",
"createdBy": "50",
"invitedUnderId": 0,
"skipBiometrics": true,
"mainRecordOfficer": null,
"employeeId": "777777",
"fondId": 0
}

如上图所示,通过jersey客户端使用web服务后,我得到的是HTML内容,而不是JSON-

Output from Server .... 
<HTML content .......>

然后我得到了这个例外-

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $ 

我知道原因,它无法将JSON转换为object,因为我们没有收到JSON响应altogrther(这是实际问题)。此外,我在错误日志中没有得到任何信息。可能是什么原因,我错过了什么?

任何帮助都将不胜感激。

共有1个答案

邵麒
2023-03-14

在泽西,如果你想返回JSON,你应该使用@Produces(MediaType.APPLICATION_JSON)声明

@products注释用于指定资源可以生成并发送回客户端的MIME媒体类型或表示。

在方法中添加行:

@RequestMapping("/userJSON2/{preRegisterId}")
@Produces(MediaType.APPLICATION_JSON)
public PreRegisterJsonResponse userJson2(@PathVariable long preRegisterId) {
 类似资料:
  • 出于某种原因,我通过POST提交的表单发送的是选项文本,而不是表单的选项值。这是我的选择声明: 当我用PHP打印我的$\u POST数组时。我有: 我对jquery特别陌生,我使用jquery以模态的方式呈现表单,因此我将粘贴下面的完整表单/div和javascript,以防相关: return_frequency()是一个php函数,根据输入返回“每2周”或“每周”。 我错过了什么?

  • (关于如何强制C#FtpWebRequest使用直接IP而不是通过HTTP代理进入互联网?) 使用C#从FTP服务器获取目录列表。输出被格式化为超文本标记语言。必需是一个未格式化的列表(由Linuxls命令返回)。(试图避免解析超文本标记语言以获取文件列表。) 意见: > FTP服务器是由客户端运行的vsftpd。 在例如Filezilla FTP服务器上列出目录时,不会出现此问题。 获取目录列表

  • 我在将一些客户端数据表逻辑迁移到服务器端时遇到了一些困难。 我当前的问题是,对于Datatables,如果要对一大组数据(20000行)进行分页,我首先需要加载控制器中的所有行,然后将它们传递给视图: 然后,在加载所有内容和Datatables将记录分页为500页之前,需要等待大约2分钟: 我更改了Datatables声明,以通过处理服务器端处理,如下所示: 让它按我所希望的方式工作非常顺利,但问

  • 我在jQuery中看到了这一点——它做了什么?

  • 我在stackoverflow上看了其他一些答案,但没有找到一个回答我问题的答案。 我有一个变量工具快捷方式,它是由对象数组组成的对象: 我试图为对象中的每个元素(上面对象中的3个元素)返回一些HTML。因为我使用的是带有return语句的for循环,所以只显示每个数组的前几个元素(3个元素中的2个)。如何显示所有三个元素?

  • 我想选择强标签内的文本,但不在其下的div。。。 有没有可能直接与jsoup合作? 我的选择尝试(不工作,选择强标签内的完整内容): HTML: