JAXB и Guice: как интегрировать и визуализировать? - PullRequest
13 голосов
/ 22 сентября 2011

Я считаю, что использование JAXB вместе с Guice возможно, но сложно: обе библиотеки «борются» за контроль над созданием объектов, вам следует быть осторожным, чтобы избежать циклических зависимостей, и это может привести к путанице со всеми JAXB Adapters и GuiceProviders и прочее.Мои вопросы:

  • Как вы справляетесь с этой конфигурацией?Какие общие стратегии / практические правила можно применять?
  • Можете ли вы указать мне хороший учебник или хорошо написанный пример кода?
  • Как визуализировать зависимости (включая Adapters и Providers)?

1 Ответ

4 голосов
/ 25 сентября 2011

Для некоторого примера кода некоторая работа с примером была сделана здесь: http://jersey.576304.n2.nabble.com/Injecting-JAXBContextProvider-Contextprovider-lt-JAXBContext-gt-with-Guice-td5183058.html

В строке с надписью «Неправильно?» Введите рекомендованную строку.

Я выгляжу так:

@Provider 
public class JAXBContextResolver implements ContextResolver<JAXBContext> { 

    private JAXBContext context; 
    private Class[] types = { UserBasic.class, UserBasicInformation.class }; 

    public JAXBContextResolver() throws Exception { 
         this.context = 
       new JSONJAXBContext( 
         JSONConfiguration.natural().build(), types); 
     } 

    public JAXBContext getContext(Class<?> objectType) { 
        /* 
        for (Class type : types) { 
            if (type == objectType) { 
                return context; 
            } 
        } // There should be some kind of exception for the wrong type.
        */ 
        return context; 
    } 
} 

//My resource method: 

    @GET 
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) 
    public JAXBElement<UserBasic> get(@QueryParam("userName") String userName) { 
        ObjectFactory ob = new ObjectFactory(); 
        UserDTO dto = getUserService().getByUsername(userName); 
        if(dto==null) throw new NotFoundException(); 
        UserBasic ub = new UserBasic(); 
        ub.setId(dto.getId()); 
        ub.setEmailAddress(dto.getEmailAddress()); 
        ub.setName(dto.getName()); 
        ub.setPhoneNumber(dto.getPhoneNumber()); 
        return ob.createUserBasic(ub); 
    } 

//My Guice configuration module: 

public class MyServletModule extends ServletModule { 


    public static Module[] getRequiredModules() { 
        return new Module[] { 
                new MyServletModule(), 
                new ServiceModule(), 
                new CaptchaModule() 
         }; 
    } 


    @Override 
    protected void configureServlets() { 
        bind(UserHttpResource.class); 
        bind(JAXBContextResolver.class);
        serve("/*").with(GuiceContainer.class); 
    } 
} 
...