I got it working.  Here's what I did.  

I had to implement a custom serialization to XML.  Reason why is because I 
my model is based on EMF <http://www.eclipse.org/modeling/emf/> and it does 
its own XML. But I also had to support JSON.  I did an implementation of 
MessageBodyWriter for my XML serialization.  I did nothing for my JSON 
serialization.

The key was to register my MessageBodyWriter with jersey.  I did it in in 
the run method of my Application like this:

    @Override
    public void run(ForecastConfiguration configuration, Environment 
environment)
            throws Exception {
          environment.jersey().register(
                new IndexResource());

        environment.jersey().getResourceConfig().register(new 
FHIRMessageWriter<Conformance>());        
     }


My MessageBodyWriter looks like this:

@Produces(MediaType.APPLICATION_XML)
public class FHIRMessageWriter<T extends EObject> implements 
MessageBodyWriter<T> {
    
    Logger log = LoggerFactory.getLogger(FHIRMessageWriter.class);

    protected static ResourceSet resourceSet = new ResourceSetImpl();
    protected static Resource resource;

    static {
        FhirPackage.eINSTANCE.eClass();
        XhtmlPackage.eINSTANCE.eClass();
        resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().
put("xml", new XMLResourceFactoryImpl());
        resource = resourceSet.createResource(URI.createURI("xxx.xml"));
    }

    @Override
    public long getSize(T arg0, Class<?> arg1, Type arg2, Annotation[] arg3, 
MediaType arg4) {
        return 0;
    }

    @Override
    public boolean isWriteable(Class<?> arg0, Type arg1, Annotation[] arg2, 
MediaType arg3) {
        return true;
    }

    @Override
    public void writeTo(T ir, Class<?> clazz, Type type, Annotation[] ann, 
MediaType mt,
            MultivaluedMap<String, Object> mvm, java.io.OutputStream stream)
            throws IOException, WebApplicationException {
        log.trace("writeTo==>");
        resource.getContents().add((EObject) ir);

        try {
            resource.save(stream, Collections.EMPTY_MAP);
        } catch (IOException e) {
            log.error("", e);
        }

    }
}

One of my REST calls in IndexResource looks like this:

    @GET
    @Path("/Conformance")
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
    public Conformance getConformance(@HeaderParam("content-type") String 
contentType) {
        Conformance conformance = FhirFactory.eINSTANCE.createConformance();
        conformance.setId(FHIRUtil.createId());
        conformance.setUrl(ForecastUtil.URIs.FORECAST_CONFORMANCE.uri);
        conformance.setStatus(FHIRUtil.CONFORMANCE_STATUS.DRAFT.code);
        conformance.setExperimental(FHIRUtil.BOOLEAN.TRUE.bool);
        conformance.setFhirVersion(FHIRUtil.createId());
        conformance.setDate(FHIRUtil.convertDateTime(new Date()));
        conformance.getProfile().add(ForecastUtil.PROFILEs.
FORECAST_IMMUNIZATIONRECOMMENDATIONRECOMMENDATION.reference);
        conformance.getProfile().add(ForecastUtil.PROFILEs.
FORECAST_IMMUNIZATIONRECOMMENDATION.reference);
        conformance.getProfile().add(ForecastUtil.PROFILEs.
FORECAST_IMMUNIZATION.reference);
        conformance.getProfile().add(ForecastUtil.PROFILEs.FORECAST_PATIENT.
reference);
        conformance.getFormat().add(FHIRUtil.FORMAT.JSON.code);
        conformance.getFormat().add(FHIRUtil.FORMAT.XML.code);
       return conformance;
    }


Finally, I tested it all with these using RestAssured:  They dump the 
results so I can do a visual.

    @Test
    public void testConformanceJSON() {
        given().
        accept(ContentType.JSON).
        when().
        get("/forecast/Conformance").then().log().body();        
    }
    
    @Test
    public void testConformanceXML() {
        given().
        accept(ContentType.XML).
        when().
        get("/forecast/Conformance").then().
        log().body();        
    }



On Monday, October 3, 2016 at 8:55:27 AM UTC-4, 
[email protected] wrote:
>
> All,
>
> Using DW 0.9.0.
>
> I need to have jersey serialize my model into either JSON or XML depending on 
> the request.  I think I get that part.  
> But my model is generated using EMF (Eclipse Modeling Framework) and so 
> annotating code would be, to say the least, ill advised. I need to implement 
> custom serialization for XML.  As I understand it, that means implementing 
> the interface InjectableProvider, which should be a part of jersey, however I 
> am not finding it
> in DW.   How can I get this done the DW way?
>
> Thanks in advance
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"dropwizard-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to