Java 爪哇/杰克逊-x27;无法识别的令牌';传递JSON对象参数

Java 爪哇/杰克逊-x27;无法识别的令牌';传递JSON对象参数,java,json,post,deserialization,Java,Json,Post,Deserialization,带有Jersey/Jackson的javajax-rsweb服务,服务方法需要一个用户参数(POJO)作为JSON。客户端应用程序(Angular 6)发送一个包含用户参数(序列化为JSON)的POST请求。服务方法调用失败,并显示错误消息:“无法识别的令牌'jsonUser':应为('true','false'或'null')” 这是用户类(POJO)-您可以看到我尝试使用@JsonProperty注释所有属性,但这是不必要的,因为我没有“重命名”它们: 以下是(Java)服务方法,它应该接受

带有Jersey/Jackson的javajax-rsweb服务,服务方法需要一个用户参数(POJO)作为JSON。客户端应用程序(Angular 6)发送一个包含用户参数(序列化为JSON)的POST请求。服务方法调用失败,并显示错误消息:“无法识别的令牌'jsonUser':应为('true','false'或'null')”

这是用户类(POJO)-您可以看到我尝试使用@JsonProperty注释所有属性,但这是不必要的,因为我没有“重命名”它们:

以下是(Java)服务方法,它应该接受并处理POST请求:

/**
 * Web service method.
 */
@POST
@Path("getTkHomeUnitEmployees")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response getTkHomeUnitEmployees(User user, @HeaderParam("X-Request-Param") String homeUnitCode) throws Exception {
    String exceptionMessage;

    if (user == null) {
        exceptionMessage = "getTkHomeUnitEmployees() received a null User.";
        log.error(exceptionMessage);
        Response response = Response
                .status(500)
                .entity(exceptionMessage)
                .build();
        return response;
    }
    if (homeUnitCode == null || homeUnitCode.equals("")) {
        exceptionMessage = "getTkHomeUnitEmployees() received a null HomeUnitCode.";
        log.error(exceptionMessage);
        Response response = Response
                .status(500)
                .entity(exceptionMessage)
                .build();
        return response;
    }
    if (!user.hasTauthority()) {
        exceptionMessage = "getTkHomeUnitEmployees() received a request from a non-timekeeper and non-collector.";

        log.error(exceptionMessage);
        Response response = Response
                .status(500)
                .entity(exceptionMessage)
                .build();
        return response;
    }
    try {
        Employee[] tkHomeUnitEmployees = new SecurityDao().getTkHomeUnitEmployees(user.getEmployeeId(), homeUnitCode);

        Response response = Response
                .ok(tkHomeUnitEmployees)
                .header("Access-Control-Allow-Origin", "*")
                .build();
        return response;
    } catch (Exception ex) {
        exceptionMessage = "getTkHomeUnitEmployees(): " + ex;
        Response response = Response
                .status(500)
                .entity(exceptionMessage)
                .build();
        return response;
    }
}
将用户对象(客户端,Javascript)转换为JSON并封装为HttpParams中的参数;POST将其传递到请求主体中

以下是(角度)客户端方法,它将POST请求发送到web服务:

getTkHomeUnitEmployees(user: User, homeUnitCode: string): Observable<Employee[]> {
    const headers = new HttpHeaders()
        .set('Content-Type', 'application/json')
        .set('X-Request-Param', homeUnitCode); // homeUnitCode parameter in HttpHeaders

    const httpOptions = {
        headers: headers
    };

    let jsonUser: string = JSON.stringify(user);

    const httpParams = new HttpParams()
        .set('jsonUser', jsonUser);

    let postUrl = this.wsUrl + 'getTkHomeUnitEmployees';
    //postUrl += '?homeUnitCode=' + homeUnitCode; // homeUnitCode parameter as QueryParam

    let obsArrayEmployees: Observable<Employee[]> = this.httpClient.post<Employee[]>(postUrl, httpParams, httpOptions);
    return obsArrayEmployees;
}
getTkHomeUnitEmployees(用户:用户,homeUnitCode:string):可观察{
const headers=新的HttpHeaders()
.set('Content-Type','application/json')
.set('X-Request-Param',homeUnitCode);//HttpHeaders中的homeUnitCode参数
常量httpOptions={
标题:标题
};
让jsonUser:string=JSON.stringify(用户);
const httpParams=新的httpParams()
.set('jsonUser',jsonUser);
让postrl=this.wsUrl+'getTkHomeUnitEmployees';
//postrl+='?homeUnitCode='+homeUnitCode;//homeUnitCode参数为QueryParam
让obsarayEmployees:Observable=this.httpClient.post(postrl、httpParams、httpOptions);
返回员工;
}
…这里我正在调试客户端(@browser Dev Tools),在getTkHomeUnitEmployees()方法中有一个中断:

…我已经在控制台中显示了jsonUser的值:

…以下是响应中的错误:

…这是请求参数

因此,Jackson JsonParser似乎正在尝试读取和解析请求中发送的参数,但该参数在开始时包含“jsonUser=”作为其值的一部分(要解析的json)。这显然是错误的

服务方法在实际输入/处理代码之前爆炸;我无法在服务方法中设置断点来检查参数的值。它表现为“参数无效,返回调用方”响应

我本想手动将“jsonUser=”从它(@client-side)中破解出来,但它不在那里。在客户端,“jsonUser=”不是参数值的一部分;我相信这只是http参数的key=value语法(parameter name=parameter value),可能是在将参数封装到HttpParams对象中时加了前缀


很明显我做错了什么,但我一直没能弄明白;我认为这是正确的方法,但显然不是。希望有人能尽快提供帮助,我已经在这个问题上纠缠了几天。

您不需要将“user”对象转换为字符串以传递到后端。尝试按原样传递用户对象

this.httpClient.post<Employee[]>(postUrl, user, httpOptions);
this.httpClient.post(postrl、user、httpOptions);

还请检查传递的参数是否与公开的rest服务匹配。

OMG,就是这样。。。!我觉得很简单,谢谢你的帮助!
this.httpClient.post<Employee[]>(postUrl, user, httpOptions);