- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
通读 Jersey 源代码,我注意到one of the default MessageBodyReader
implementations创建 SAXSource
然后将其传递给Unmarshaller
。
@Override
protected Object readFrom(Class<Object> type, MediaType mediaType,
Unmarshaller u, InputStream entityStream)
throws JAXBException {
final SAXSource s = getSAXSource(spf.provide(), entityStream);
if (type.isAnnotationPresent(XmlRootElement.class)) {
return u.unmarshal(s);
} else {
return u.unmarshal(s, type).getValue();
}
}
我的问题:为什么是InputStream
包裹在 SAXSource
?
Unmarshaller.unmarshal
可以接受 InputStream
就其本身而言,以及 com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl
似乎使用相同的内部方法来解码是否 SAXSource
或InputStream
已提供。唯一的区别似乎是 XmlRootElementJaxbProvider
使用依赖注入(inject)来提供 Factory<SAXParserFactory>
用于获取 SAXParserFactory
,而在UnmarshallerImpl
的肠子里方法SAXParserFactory.newInstance()
被直接调用。是希望能够注入(inject)自定义SAXParserFactory
唯一的原因unmarshaller.unmarshal(SAXSource)
使用而不是 unmarshaller.unmarshal(InputStream)
?
最佳答案
Git Blat 是你的 friend 。最初的实现(早在 2009 年)使用 StreamSource。更改的原因是一个错误,https://java.net/jira/browse/JERSEY-323 .
当时,是的,直接调用了 SAXParserFactory.newInstance(),但代码随后在解析器上设置了各种功能(大概这些功能当时不是由 JAXB 设置的)。您可以在这里看到:https://github.com/jersey/jersey-1.x/blob/2057807f211958860a7557abf49ac4cd6a5ef1fb/jersey-core/src/main/java/com/sun/jersey/core/impl/provider/xml/SAXParserContextProvider.java
我不确定这种改变是否仍然有必要,但这是改变的最初动机。从那时起,代码似乎就没有经过任何修改。
更改的完整差异为 here虽然不是很明显。 XmlRootElementProvider 中添加了 readFrom 方法,以覆盖 AbstractRootElementProvider 中使用 StreamSource 的方法。
关于java - 为什么 Jersey 中的 XmlRootElementJaxbProvider 使用 SAXSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36405047/
通读 Jersey 源代码,我注意到one of the default MessageBodyReader implementations创建 SAXSource然后将其传递给Unmarshalle
我是一名优秀的程序员,十分优秀!