我不好意思问:但是对于解组自定义类型的 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 解组到该对象的实例,但这没有发生。我在这里错过了什么吗?
您可以使用@Consumes注解:
@PUT
@Path("/")
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
TestChild addTestChild(TestChild testChild);
上述批准的解决方案改变了问题。 在问题中,参数是一个
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;
}
}