如何将自定义类型作为参数传递给 RestEasy 服务?

问题描述 投票:0回答:2

我不好意思问:但是对于解组自定义类型的 Resteasy 服务方法来说,正确的注释组合是什么?

我能够从返回自定义类型(带有 jaxb 注释)的方法成功生成 json 和 xml,但我未能将这些类型转换为方法参数。网络上的所有示例似乎都传递简单类型,例如字符串。

文档声称 Resteasy 可以将 json 和 xml 解组为带注释的类型,但是如何解组呢?以下签名需要一个带有带有构造函数的字符串参数的对象,这不是我正在寻找的。

@GET
@Path("/somepath/ontheserver/settestchild")
@Produces("application/xml")
String getQueryParam(@QueryParam("testchild")TestChild param);

TestChild 有 JAXB 注释,但我希望 Resteasy 将传入的 xml 解组到该对象的实例,但这没有发生。我在这里错过了什么吗?

java rest resteasy
2个回答
3
投票

您可以使用@Consumes注解:

@PUT
@Path("/")
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
TestChild addTestChild(TestChild testChild);

0
投票

上述批准的解决方案改变了问题。 在问题中,参数是一个

QueryParam
,即它的值来自于query。 在批准的答案中,它已更改为
PUT
端点,数据来自查询的有效负载,即来自其 body

实际解决方案需要

ParamConverter
。此页面是许多可用示例之一:https://blog.sebastian-daschner.com/entries/jaxrs-convert-params

public class LocalDateConverter implements ParamConverter<LocalDate> {

    @Override
    public LocalDate fromString(String value) {
        if (value == null)
            return null;
        return LocalDate.parse(value);
    }

    @Override
    public String toString(LocalDate value) {
        if (value == null)
            return null;
        return value.toString();
    }

}


////////////////////////////////////////////////////////


@Provider
public class LocalDateParamConverterProvider implements ParamConverterProvider {

    @Override
    public <T> ParamConverter<T> getConverter(Class<T> rawType, Type genericType,
            Annotation[] annotations) {
        if (rawType.equals(LocalDate.class))
            return (ParamConverter<T>) new LocalDateConverter();
        return null;
    }

}


////////////////////////////////////////////////////////



@Path("test")
@ApplicationScoped
public class TestResource {

    @GET
    public String testIndex(@QueryParam("date") LocalDate date) {
        return "hello, " + date;
    }

    @GET
    @Path("{date}")
    public String test(@PathParam("date") LocalDate date) {
        return "hello, " + date;
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.