- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个MessageBodyReader
具有以下类:
@Provider
@Consumes(MediaType.APPLICATION_JSON)
public class TransactionMessageBodyReader implements MessageBodyReader<Transaction<Customer>>
boolean isReadable(Class<?> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType)
我有以下 REST 端点:
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("trans")
public Response checkStatus(Transaction<Customer> transaction) { ... }
在我的调试器中,我在 isReadable
上有一个断点它在调用 checkStatus
之前到达断点方法。目前很好。我可以在调试器中看到 genericType
说Transaction<Customer>
...换句话说,它知道类型信息。当Java类型删除将其删除为Transaction
时,它怎么可能知道类型信息?在运行时?我看到 genericType
由 ParameterizedType
组成我相信它用于传递类型信息(以解决类型删除问题)。但是, Jersey 如何填充 genericType
自动地?因为除了上面发布的方法 header 之外,我从未指定过类型信息。
另外,第二个问题:如果 Jersey “自动”了解我的类型,为什么我需要 MessageBodyReader
根本吗?是否有一些更简单的方法可以将泛型与 Jersey/REST 端点一起使用并使其“正常工作”?
最佳答案
看看javadoc .
genericType
- the type of instance to be produced. E.g. if the message body is to be converted into a method parameter, this will be the formal type of the method parameter as returned byMethod.getGenericParameterTypes
.
类、方法和字段中的通用参数化在相应的.class
文件中维护。这显然是编译所必需的。如果不是这种情况,您将无法将 Java 类打包并用作库。
反射公开此类型信息(以及更多信息)。
Jersey 基本上会扫描您的类中的处理程序方法,用 @POST
等注释的方法,并检索相应的 Method
对象。一旦有了,它就可以使用 Method#getGenericParameterTypes()
Returns an array of
Type
objects that represent the formal parameter types, in declaration order, of the executable represented by this object. Returns an array of length 0 if the underlying executable takes no parameters.If a formal parameter type is a parameterized type, the
Type
object returned for it must accurately reflect the actual type parameters used in the source code.
换句话说,Type
必须同时表示参数的原始类型及其参数化(如果有的话)。
因此 Jersey 检索这些类型并将它们输入到您的 MessageBodyReader
中。期望您的实现应该能够处理genericType
。
我不太了解 Jersey,但如果它遵循与 Spring MVC 相同的策略,它将简单地迭代所有已注册的 MessageBodyReader
实例。它实际上并不关心它的类型(例如,您的TransactionMessageBodyReader),这就是它依赖于isReadable的原因。理论上,它可以保留类型到 MessageBodyReader
实现的映射,但这最终会变得笨拙且不太灵活。无论如何,应用程序通常不会有那么多可以序列化的类型/格式,因此迭代一些对象并不是什么大问题。
自 Java 8 起,您还可以访问 Executable#getParameters
(Method
是 Executable
的子类型)。
这是 Jersey 可以做什么的示例
public class StackOverflow {
public static void main(String[] args) throws Exception {
Method method = StackOverflow.class.getDeclaredMethod("method", List.class);
Type[] parameterTypes = method.getGenericParameterTypes();
for (Type parameterType : parameterTypes) {
System.out.println(parameterType.getClass());
System.out.println(parameterType);
ParameterizedType parameterizedType = (ParameterizedType) parameterType;
System.out
.println(parameterizedType.getRawType().getTypeName() + "<" + parameterizedType.getActualTypeArguments()[0].getTypeName() + ">");
}
}
public String method(List<StackOverflow> parameter) {
return "example";
}
}
打印
class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
java.util.List<com.example.StackOverflow>
java.util.List<com.example.StackOverflow>
关于java - MessageBodyReader 如何知道泛型类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37219300/
我有一个MessageBodyReader具有以下类: @Provider @Consumes(MediaType.APPLICATION_JSON) public class Transaction
给定类似的内容: 例如 class User{ String name; String someField1; } @Consumes("some/media-type") class Re
我正在为 restful web 服务制作一个 java 客户端,我想在请求正文中发送一个字符串。 这是我的课。 public class params { private String t
我正在尝试实现一个新的 MessageBodyReader/Writer 组合,但阅读器部分遇到问题。鉴于以下声明 public class Jsr367EnumProvider implements
我有这个界面: @Path("inbox") public interface InboxQueryResourceTest { @POST @Path("{membershipEx
我有课 public class Tree { private T value; private Tree parent; private List> children;
我有某种类型的 XSD 架构,我们将其命名为 A。 然后我尝试使用 XSD 架构验证编写 MessageBodyReader - 如果我在那里传递单个对象,它就可以工作。但我怎样才能让它读取这些类型的
我编写了一个简单的 RestEasy 客户端代理来执行 iTunes 搜索。它看起来像这样: @Path("/") public interface AppleAppStoreLookupClient
我正在尝试将 Jersey 与我自己的 json MessageBodyReader/MessageBodyWriter 一起使用(因为我没有在我的域类上使用 @XmlRootElement... 注
所以,我有一个 REST 应用程序,看起来像这样: @GET @Produces(MediaType.APPLICATION_JSON) @Path("/getpartners") public Ha
我正在从提供者处了解 MessageBodyReader 方法的工作原理。我看到该方法返回一个对象,但我不确定如何从服务访问该对象。我能否得到有关如何从阅读器类返回对象的解释?这将帮助我为所有 DTO
首先我应该说我是 Maven 的新手,甚至认为我不认为 Maven 与这个错误有关。我正在使用 Eclipse 4.2.1 和 m2e 我有从 ckan4j 获得的代码开发者 Client c = C
我想使用 Grails-jaxrs plugin实现自定义 MessageBodyReaderSupport从客户端读取 UserDto 类。 如何实现 UserDtoReader 才能获取 User
我有一个 REST api,它返回一个 json 格式的对象,Content-Type 为 application/json,非常标准。 我正在使用 Jersey 的测试框架创建一个基本的 TestN
以下方法不允许我的 servlet 容器启动: @PUT public String upload(final Customer customer, final Control control) {
我正在尝试使用预配置的资源实例在预配置的端口/url 上启动 Jersey。我不太清楚如何正确地做到这一点。 这是一段代码。请帮我填空: @Component @PerRequest @Path("/
我在 Response 对象中返回一个 StreamingOutput: @GET @Path("/downloadFile/{filename}") @Produces(MediaType.TEXT
我已经在 SO 上发现了一些类似的问题,但似乎没有一个能解决我的特定问题,而且我一直无法自己找到解决方案。 这是我遇到的错误: Caused by: org.glassfish.jersey.mess
我试图在 Jersey 的 MessageBodyReader 中读取 APPLICATION_FORM_URLENCODED。当我尝试使用 BufferedReader 读取流时,流返回空数据 这是
我正在尝试从 http://api.openweathermap.org/data/2.5/forecast/daily?lat=35&lon=139&cnt=10&mode=json 接收 json
我是一名优秀的程序员,十分优秀!