2010-08-02 34 views
1

我正在使用Jersey Client API實現使用JSON數據的其餘客戶端。我對JAXB並沒有太多的經驗,特別是與JSON的結合。我按照提供的示例here註冊了JAXBContext。Jersey客戶端,使用Maven執行應用程序時使用的JAXBContext,但不使用java -jar

當我使用mvn exec:java執行項目時,一切都很有魅力。

我使用Maven assembly插件創建單個JAR。當我使用這個JAR文件運行客戶端時,JAXBContext看起來並沒有被使用。這會導致:

「com.sun.jersey.api.client.ClientHandlerException:消息正文閱讀器的Java類org.digitest.model.Account和Java類型的類org.digitest.model.Account,和MIME媒體類型應用程序/ json未找到「

有沒有人有任何想法,當我可能做錯了?即使模糊的提示如何進行調試將不勝感激!

@Provider 
public final class ModelJAXBContextResolver implements ContextResolver<JAXBContext> { 

    private final JAXBContext context; 
    private final Set<Class> types; 
    private final Class[] cTypes = { 
     Account.class, ... 
    }; 

    public ModelJAXBContextResolver() throws Exception { 
     this.types = new HashSet(Arrays.asList(cTypes)); 
     this.context = new JSONJAXBContext(JSONConfiguration.natural().build(), cTypes); 
     throw new Exception("Json context is loaded"); 
    } 

@Override 
    public JAXBContext getContext(Class<?> objectType) { 
     return (types.contains(objectType)) ? context : null; 
    } 

} 

客戶端安裝:

DefaultApacheHttpClientConfig config = new DefaultApacheHttpClientConfig(); 
config.getProperties().put(DefaultApacheHttpClientConfig.PROPERTY_HANDLE_COOKIES, true); 
config.getClasses().add(ModelJAXBContextResolver.class); 

client = ApacheHttpClient.create(config); 

帳戶:

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Account { 
    ... 
} 

回答

3

終於來了!這可能是我今年不得不面對的最煩人的事情!

添加1.4-SNAPSHOT版本的球衣依賴解決了它。

<dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-bundle</artifactId> 
     <version>1.4-SNAPSHOT</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-json</artifactId> 
     <version>1.4-SNAPSHOT</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.jersey.contribs</groupId> 
     <artifactId>jersey-apache-client</artifactId> 
     <version>1.4-SNAPSHOT</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.xml.bind</groupId> 
     <artifactId>jaxb-impl</artifactId> 
     <version>2.2.2-SNAPSHOT</version> 
    </dependency>