2012-02-14 46 views
0

我很新的apache cxf,我開發了一個使用這種技術的Web服務。org.apache.cxf.interceptor.Fault:編組錯誤:com.dosideas.cxf.Item不知道這個上下文

XmlSchema-1.4.2.jar,commons-logging-1.1.1.jar,cxf-2.1.3.jar,geronimo-activation_1.1_spec-1.0.2.jar,geronimo-annotation_1.0_spec-1.1。 1.jar,geronimo-javamail_1.4_spec-1.3.jar,geronimo-servlet_2.5_spec-1.2.jar,geronimo-ws-metadata_2.0_spec-1.1.2.jar,jaxb-api-2.1.jar,jaxb-impl- 2.1.7.jar,neethi-2.0.4.jar,saaj-api-1.3.jar,saaj-impl-1.3.2.jar,wsdl4j-1.6.2.jar,xml-resolver-1.2.jar

這是接口:

@WebService 
public interface StoreAdmin 
{ 
    boolean logIn(@WebParam(name="legajo") String legajo 
      ,@WebParam(name="lat") String lat 
      ,@WebParam(name="lon") String lon)               throws StoreException; 

    boolean logOut(@WebParam(name="legajo") String legajo)              throws StoreException; 


    boolean addItemToSystem(@WebParam(name="isbn") String isbn 
         ,@WebParam(name="descripcion") String descripcion 
         ,@WebParam(name="precio") double precio 
         ,@WebParam(name="numeroTotal") int numeroTotal)            throws StoreException; 
    @WebResult(name="item") 
    com.dosideas.cxf.Item getItem(@WebParam(name="isbn") String isbn)            throws StoreException; 

    } 

這是實現文件:

package com.dosideas.cxf; 

    import com.dosideas.cxf.exception.StoreException; 
    import com.dosideas.cxf.service.ServicioEncriptacion; 
    import com.dosideas.cxf.service.ServicioItems; 
    import com.dosideas.cxf.service.ServicioUsuarios; 
    import java.util.logging.Level; 
    import java.util.logging.Logger; 
    import javax.jws.WebService; 

    /** 
    * 
    * @author alonso 
    */ 
    @WebService(endpointInterface = "com.dosideas.cxf.StoreAdmin",serviceName="storeAdmin") 
    public class StoreAdminImpl implements StoreAdmin{ 

    //injectd by spring 
    private ServicioUsuarios   servicioUsuarios; 
    private ServicioEncriptacion  servicioEncriptacion; 
    private ServicioItems    servicioItems; 

    //constructor... 
    StoreAdminImpl(ServicioUsuarios _servicioUsuarios 
      , ServicioEncriptacion _servicioEncriptacion 
      ,ServicioItems _servicioItems) 
    { 
    this.servicioUsuarios=_servicioUsuarios; 
    this.servicioEncriptacion=_servicioEncriptacion; 
    this.servicioItems=_servicioItems;   
} 

... 
// there are more methods but I don't put here, not relevant 

public Item getItem(String isbn) throws StoreException { 
    return servicioItems.getItem(isbn); 
} 

public ServicioUsuarios getServicioUsuarios() 
{ 
    return servicioUsuarios; 
} 

}

ServicioItemsImpl.getItem方法:

hashMapItems是一個的ConcurrentHashMap

public Item getItem(String isbn) throws StoreException 
    { 
    Logger.getLogger(ServicioItemsImpl.class.getName()).log(Level.INFO, "ServicioItemsImpl. INIT getItem."); 

    Item item = (Item) ServicioItemsImpl.hashMapItems.get(isbn); 
    if (item==null) 
    { 
     Logger.getLogger(ServicioItemsImpl.class.getName()).log(
      Level.WARNING, "ServicioItemsImpl. METHOD: getItem. ERROR. el item con isbn: {0} no existe en el sistema.", isbn); 

     //throw new StoreException("27",isbn,null); 
    } 
    else 
     Logger.getLogger(ServicioItemsImpl.class.getName()).log(
      Level.INFO, "ServicioItemsImpl. END isbn´s Item: {0}",item.getIsbn()); 

    return item; 

} 

applicationContext.xml中:

<import resource="classpath:META-INF/cxf/cxf.xml" /> 
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> 
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> 


<!-- Declaramos el bean implementación del Servicio Web. Como vemos, es 
    un bean más de Spring, por lo que podemos inyectarle dependencias, 
    interceptores, y demás. 
--> 
<bean id="holaMundoImpl" class="com.dosideas.cxf.HolaMundoImpl"/> 

<bean id="servicioUtiles" class="com.dosideas.cxf.service.ServicioUtilesImpl"/> 

<bean id="servicioUsuarios" class="com.dosideas.cxf.service.ServicioUsuariosImpl"> 
    <constructor-arg ref="servicioUtiles"/> 
    <constructor-arg ref="servicioEncriptacion"/> 
</bean> 

<bean id="servicioEncriptacion" class="com.dosideas.cxf.service.ServicioEncriptacionImpl"/> 

<bean id="servicioItems" class="com.dosideas.cxf.service.ServicioItemsImpl"/> 

<bean id="servicioApuntesContables" class="com.dosideas.cxf.service.ServicioApuntesContablesImpl"/> 

<bean id="storeImpl" class="com.dosideas.cxf.StoreImpl"> 
    <constructor-arg ref="servicioUsuarios"/> 
    <constructor-arg ref="servicioEncriptacion"/> 
    <constructor-arg ref="servicioItems"/> 
    <constructor-arg ref="servicioApuntesContables"/> 
</bean> 

<bean id="storeAdminImpl" class="com.dosideas.cxf.StoreAdminImpl"> 
    <constructor-arg ref="servicioUsuarios"/> 
    <constructor-arg ref="servicioEncriptacion"/> 
    <constructor-arg ref="servicioItems"/> 
</bean> 


<!-- Declaramos el endpoint de nuestro servicio web, indicando cual es la 
    clase de implementación. En el atributo "implementor" podemos escribir 
    el nombre completo de la clase implementación, o referenciar a un 
    bean de Spring usando un # seguido del nombre del bean. 
--> 
<jaxws:endpoint 
    id="holaMundo" 
    implementor="#holaMundoImpl" 
    address="/HolaMundo" /> 

<jaxws:endpoint 
    id="store" 
    implementor="#storeImpl" 
    address="/StoreImpl" /> 

<jaxws:endpoint 
    id="storeAdmin" 
    implementor="#storeAdminImpl" 
    address="/StoreAdminImpl" /> 

這是我測試的JUnit文件:

@Test 
public void testGetItem() 
{ 
    Logger.getLogger(StoreAdminTest.class.getName()).log(Level.INFO, "INIT testGetDescriptionItem"); 

    try 
    { 
     boolean retorno = instance.addItemToSystem("8717418323691", "Castle Tercera Temporarada DVD",39.95,100); 
     assertEquals(true,retorno); 

     //broken here 
     //org.apache.cxf.interceptor.Fault: Marshalling Error: com.dosideas.cxf.Item is not known to this context 

     Item item = instance.getItem("8717418323691"); 
     assertEquals(true, item!=null); 
     assertEquals("Castle Tercera Temporarada DVD",item.getDescripcion()); 

    } catch (StoreException ex) { 
     Logger.getLogger(StoreAdminTest.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    Logger.getLogger(StoreAdminTest.class.getName()).log(Level.INFO, "END testGetDescriptionItem"); 

} 

項目POJO類:

package com.dosideas.cxf; 

/** 
* 
* @author alonso 
*/ 
public class Item { 

private String isbn; 
private String descripcion; 
private double precio; 
private int numeroTotal; 

Item(){}; 
Item(String isbn,String descripcion,double precio,int numeroTotal) 
{ 
    this.isbn=isbn; 
    this.descripcion=descripcion; 
    this.precio=precio; 
    this.numeroTotal=numeroTotal; 
}; 

public String getDescripcion() { 
    return descripcion; 
} 

public void setDescripcion(String descripcion) { 
    this.descripcion = descripcion; 
} 

public String getIsbn() { 
    return isbn; 
} 

public void setIsbn(String isbn) { 
    this.isbn = isbn; 
} 

public int getNumeroTotal() { 
    return numeroTotal; 
} 

public void setNumeroTotal(int numeroTotal) { 
    this.numeroTotal = numeroTotal; 
} 

public double getPrecio() { 
    return precio; 
} 

public void setPrecio(double precio) { 
    this.precio = precio; 
} 


public void decrementarNumeroTotal() 
{ 
    if (getNumeroTotal()>0) 
     setNumeroTotal(getNumeroTotal() - 1); 
    else 
     setNumeroTotal(0); 
} 

}

異常日誌:

org.apache.cxf.interceptor.Fault:編組錯誤:com.dosideas.cxf.Item不知道這種情況下

我不知道是什麼繼續,我花了3天的時間閱讀博客,請幫助!

+0

您的'Item'類沒有被JAXB註釋。看起來你對這項技術是新手,如果是這樣的話,我建議你使用'wsimport'從WSDL生成bean,如果你有信心,修改bean。 – 2012-02-15 21:31:39

+0

thx爲響應dma_k,即時通訊新手與cxf,但沒有開發web服務。它看起來像cxf不marshall項目pojo,爲什麼frakking地獄不這樣做?在此期間,我會檢查wsimport – aironman 2012-02-16 10:28:50

+0

您好再次,我已經解決了我的問題,對不起,默認範圍構造函數不公開,arggg。無論如何,thx的答案 – aironman 2012-02-16 14:29:10

回答

0

我已經解決了我的問題,對不起,默認範圍構造函數不公開,arggg。無論如何,thx的答案

相關問題