0

私はJAX-RS応答メソッドを持っています

@Produces('application/xml', 'application/json')

これを生成する JAX-B エンティティもあります。

<person>
    <name>joe</name>
    <address>
        <street>123 home</street>
    </address>
<person>

この通話の/person/Joe

で返信したいと思います/person/joe/address

そして戻る

  <address>
       <street>123 home</street>
  </address>

JAX-RS/Jersey を使用するとエラーが発生します。

MIME タイプが application/XML の場合、タイプ Address.class のマーシャラーはありません

これは、アドレス オブジェクトに として注釈が付けられていないために発生しています@XMLRootElement

4

2 に答える 2

0

このシナリオを処理するための簡単なプロバイダーを作成しましたが、期待どおりに機能しているようです。xmlTypeをjaxbelementでラップして、マーシャリングできるようにします。

/**
 * by default we are unable to write an {@link XmlType} object as xml it must be
 * an {@link XmlRootElement} based object this class will wrap {@link XmlType}
 * with {@link JAXBElement} and marshall them
 * 
 * @author shaun
 * 
 */
@Provider
@Consumes({ "application/xml", "text/xml" })
public class XMLTypeWriter extends AbstractRootElementProvider {

    private static final Logger logger = LoggerFactory.getLogger(XMLTypeWriter.class);

    public XMLTypeWriter(@Context Providers ps) {
        super(ps, MediaType.APPLICATION_XML_TYPE);
    }

    @Override
    protected boolean isSupported(MediaType m) {
        return (m.equals(MediaType.APPLICATION_XML_TYPE) || m.equals(MediaType.TEXT_XML_TYPE));
    }

    @Override
    public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        // There is already a xmltype reader defined.
        return false;
    }

    @Override
    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        return type.isAnnotationPresent(XmlType.class) && isSupported(mediaType);
    }

    @Override
    protected void writeTo(Object t, MediaType mediaType, Charset c, Marshaller m, OutputStream entityStream) throws JAXBException {

        // need to get the type name from the annotation
        XmlType xt = t.getClass().getAnnotation(XmlType.class);
        JAXBElement p = null;
        if (xt != null) {
            String name = xt.name();
            p = new JAXBElement(QName.valueOf(name), t.getClass(), t);
        }
        super.writeTo(p, mediaType, c, m, entityStream);
    }
}
于 2013-02-23T00:29:50.790 に答える
0

Addressクラスに注釈を付ける@XmlRootElementか、 のインスタンスでラップすることができますJAXBElement

new JAXBElement<Address>(
    new QName("address"), 
    Address.class, 
    address);
于 2013-02-22T09:52:17.303 に答える