我很新的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天的時間閱讀博客,請幫助!
您的'Item'類沒有被JAXB註釋。看起來你對這項技術是新手,如果是這樣的話,我建議你使用'wsimport'從WSDL生成bean,如果你有信心,修改bean。 – 2012-02-15 21:31:39
thx爲響應dma_k,即時通訊新手與cxf,但沒有開發web服務。它看起來像cxf不marshall項目pojo,爲什麼frakking地獄不這樣做?在此期間,我會檢查wsimport – aironman 2012-02-16 10:28:50
您好再次,我已經解決了我的問題,對不起,默認範圍構造函數不公開,arggg。無論如何,thx的答案 – aironman 2012-02-16 14:29:10