2011-02-17 6 views
2

J'essaie de sérialiser la classe annotée de JAXB avec Jackson en utilisant RESTEasy. Par défaut ResteasyJacksonProvider est configuré pour utiliser uniquement l'annotation JACKSON. Est-il possible de configurer ResteasyJacksonProvider pour utiliser l'annotation JAXB en utilisant le ressort? Il y a quelques manières programmatiques mais préféreraient s'il y a une configuration de ressort.RESTEasy + Spring + Jackson + Jaxb

Couple façons Je pense

  1. Utilisez ContextResolver pour le type ObjectMapper pour revenir ObjectMapper configuré pour utiliser JaxbAnnotationIntrospector au lieu de JacksonAnnotationIntrospector.

  2. Étendez ResteasyJacksonProvider et transmettez l'annotation JAXB pendant la construction.

Tout autre moyen?

Répondre

1

Eh bien, la première option d'utilisation de ContextResolver fonctionne, mais je pense toujours qu'il devrait y avoir un moyen plus facile de le faire juste par une certaine configuration.

0

Vous pouvez obtenir ceci à partir de la configuration seulement, pas besoin de programmer quelque chose de spécial. Voici comment: d'abord définir votre droit de configuration, j'utilise Jackson + JAXB, à la fois mis en haricot ContentNegotiatingViewResolver:

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
     <property name="order" value="1"/> 
     <property name="mediaTypes"> 
      <map> 
       <entry key="xml" value="application/xml" /> 
       <entry key="json" value="application/json" /> 
      </map> 
     </property> 
     <property name="defaultViews"> 
      <list> 
       <bean class="org.springframework.web.servlet.view.xml.MarshallingView"> 
        <property name="marshaller"> 
         <oxm:jaxb2-marshaller id="marshaller"> 
          <oxm:class-to-be-bound name="com.shay.dashboard.data.structure.page.PageObject" /> 
          <oxm:class-to-be-bound name="com.shay.dashboard.data.structure.tab.TabObject" /> 
          <oxm:class-to-be-bound name="com.shay.dashboard.data.structure.section.SectionObject" /> 
          <oxm:class-to-be-bound name="com.shay.dashboard.data.structure.element.nonembedded.ElementObject"/> 
          <oxm:class-to-be-bound name="com.shay.dashboard.data.structure.element.embedded.EmbeddedElementObject"/> 
          <oxm:class-to-be-bound name="com.shay.dashboard.data.structure.chart.common.ChartManager"/> 
         </oxm:jaxb2-marshaller> 
        </property> 
       </bean> 
       <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/> 
      </list> 
     </property> 
    </bean> 

Notez que sous le placier, je mets la OXM: classe-être à bound - les sont les classes à être lié par JAXB.

Maintenant, pour le module, j'ai utilisé un paquet d'annotations ordinaires (javax.xml.bind.annotation), non spécifique au marshaller. Jackson Json et JAXB savent tous les deux comment le lire.

Par exemple:

@XmlAccessorType(XmlAccessType.NONE) @XmlRootElement(name="page") public class PageObject implements ComponentTypeObject{ @XmlAttribute(name="name") private String name; @XmlAttribute(name="id",required=true) private String id;
@XmlElements({@XmlElement(name="tab", type=TabXmlAdapter.class)}) private List<TabXmlAdapter> tabRef;

Enfin, le contrôleur pour votre MVC doit retourner un modèle et vue:

@RequestMapping(value="/get_page", method = RequestMethod.GET) 
public ModelAndView initPage() 
{ 
    ModelAndView mav = null; 
    try 
    { 
     PageObject myPage = (PageObject) Utilities.getUtilities().loadObjectFromFile(XmlComponentType.page); 
     mav = new ModelAndView("page","page",myPage); 
    } 
    catch (Exception e) 
    { 
     e.getMessage(); 
    } 
    return mav; 
} 

Maintenant, tout en appelant votre URL se terminant par .json vous obtiendrez la représentation JSON et avec .xml - et XML. Les deux sont traduits par le visualiseur, à condition que vous ayez donné le mappage correct lors de l'annotation du module.

+0

Votre solution fonctionne si le réseau à ressort ou le ressort-mvc est utilisé pour l'expédition. J'utilise RESTEasy. Merci. – Kamlesh

+0

oh, n'a pas remarqué, était trop pressé de répondre :) – jazzcool

Questions connexes