首页 > 解决方案 > Jersey 休息请求通用类型

问题描述

我无法将通用 json 请求从客户端发送到服务器。这是我的服务和 pojo 课程。有些人可以纠正我做错的地方。

服务 :

@POST
@Path("/executeApp")
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON}) 
public Response executeApp(Configuration configuration) {

}

配置类:该类由任务列表组成,任务是抽象类在下面。

@XmlRootElement
public class Configuration{


    public Configuration() {
        // TODO Auto-generated constructor stub
    }
    public  String udid;    
    public boolean overrideExistingTask;     
    public int repeatPeriodMinutes;

    public List<? extends Task> tasks;
//Getters and setters 

}

任务类:


public abstract class Task {

    public Task(){

    }
    public String testId; 
    public int pauseSeconds; 
    public int cycles;-

    public abstract String getFriendlyName();

    protected abstract Task<?> getTaskInstance();
    //Getters and setters 

}

派生类 XXXX,YYYYY 都扩展了任务:

public class XXXXX extends Task{

    String friendlyName = this.getClass().getSimpleName();

    //Extra varibles 

    public XXXXX()  {
        super();
    }

    @Override
    public String getFriendlyName() {        
        return friendlyName;
    }

    @Override
    protected Task<?> getTaskInstance() {  
    }
}

带有 json 的客户端邮递员请求:

{ 
             "udid":"123", 
             "overrideExistingTask":"true",  
              "repeatPeriodMinutes":"2",
              "tasks":[{"XXXXX":{"testId":"testId", "pauseSeconds" :"5", "cycles":"2" ,"requestId":"123" ,"url":"url", "port":"port" , "udid":"udid" }}]
}

错误:

javax.ws.rs.ProcessingException: Error deserializing object from entity stream.</p>
The server encountered an unexpected condition that prevented it from fulfilling the request.
javax.servlet.ServletException: javax.ws.rs.ProcessingException: Error deserializing object from entity stream.

如果我传递空数组而不是 XXXXX,我可以在调试模式下看到配置类(udid、overrideExistingTask、repeatPeriodMinutes)的值,​​但任务值来自 []。用户可以传递 XXXXX , YYYYY 或两者的列表。有人可以建议我在哪里做错或缺少休息注释来定义泛型类型。

标签: javarestweb-servicesgenericsjax-rs

解决方案


配置对象将无法解析提供的 JSON 输入。

配置中的任务字段是任务列表。在提供的 JSON 中,它是一个 Map(/Object) 列表,键为“XXXXX”,值为任务对象。

如果这是要使用的 JSON,则配置对象中的任务字段应修改为

public List<Map<String,<? extends Task>> tasks;

或者

应修改 JSON 输入以发送任务列表。

{
    "udid": "123",
    "overrideExistingTask": "true",
    "repeatPeriodMinutes": "2",
    "tasks": [{
        "testId": "testId",
        "pauseSeconds": "5",
        "cycles": "2",
        "requestId": "123",
        "url": "url",
        "port": "port",
        "udid": "udid"
    }
//More task objects here
]
}

推荐阅读