【问题标题】:Issue with rest Service using rest easy使用rest easy的rest服务问题
【发布时间】:2016-11-16 05:43:37
【问题描述】:

我有一个像下面这样的复杂对象

public class TestFilter {

    public TestFilter(){

    }

    private Set<String> m_categories;

    private Set<String> m_taskNames;

    public Set<String> getCategories() {
        return m_categories;
    }

    public void setCategories(Set<String> categories) {
        this.m_categories = categories;
    }

    public Set<String> getTaskNames() {
        return m_taskNames;
    }

    public void setTaskNames(Set<String> taskNames) {
        this.m_taskNames = taskNames;
    }


    public static TestFilter fromString(String jsonRepresentation){
        ObjectMapper mapper = new ObjectMapper();
        TestFilter filter= null;
        try {
            filter = mapper.readValue(jsonRepresentation, TestFilter.class );
        } catch (IOException e) {
            throw new MyException("Exception while parsing the TestFilter");
        }
        return filter;
    }
}

我在下面的休息服务中使用它

@GET
    @Path("/schedule/info")
    public Response getScheduledTasks(@QueryParam(FILTERS)TestFilter testFilter){
        if(testFilter == null){
            System.out.println("its null");
        } else {
            System.out.println("not null");
        }
        return Response.status(Status.OK).entity("Success").build();
    }

我用于访问对象的 url 如下所示。为了便于阅读,对 url 进行了解码。

https://myip:port/my-context/rest/schedule/info?filters="{"categories":["C","D"],"taskName":["TaskA"]}"

我在服务上放了一个调试点,所以它会命中服务,但问题是 testFilter 总是为空。

请告诉我代码有什么问题。

【问题讨论】:

  • 如果您从 URL 中的 JSON 中删除 "(仅外引号)会怎样?
  • 我怀疑正在发送的 json 结构。 m_categories可以在json中转换成categories吗?理想情况下,setter 和 getter 不会自动生成,而是您手动创建的?如果没有,您可以尝试以m_categories=C&amp;m_categories=D&amp;m_taskName=TaskA 发送,会发生什么?
  • @peeskillet 我收到如下异常“javax.ws.rs.NotFoundException: Unable to extract parameter from http request: javax.ws.rs.QueryParam(\"filters\") value is '{\"categories\":[\"C\",\"D\"],\"taskName\":[\"TaskA\"]}' 但这是由于任务名称拼写错误,它应该是任务名称。现在可以正常工作了。谢谢您可以将其添加为答案,以便我接受吗?

标签: java json rest jax-rs resteasy


【解决方案1】:

包裹在" 中的JSON 只是一个JSON 字符串。 JSON 对象不应包含引号。所以只需从引号中解开 JSON

filters={"categories":["C","D"],"taskNames":["TaskA"]}

另一件事,基于您的 cmets。如果您想避免 404 NotFound,如果您想将其更改为 400 Bad Request 之类的其他内容,那么只需将其抛出

throw new BadRequestException()
// or new WebApplicationException(400)

对我来说很奇怪,错误的查询参数会导致 404,但这是 JAX-RS 的指定行为。就个人而言,我只是在这种情况下将其更改为 400。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 2019-02-05
    • 2011-06-13
    • 1970-01-01
    • 2013-03-09
    相关资源
    最近更新 更多