2011-01-08 1 views
1

초보자부터 웹 서비스입니다. 저는 Restful webservice를 작성하려고했고 저는 http://www.stupidjavatricks.com/?p=54을 따랐습니다. 이 예제는 나를 위해 작동합니다. 난 내 코드베이스에서 동일하게 구현하려고 할 때 그러나 아래의 예외와 함께 실패 : 나는 창문에 최신 스프링 3.0.5.RELEASE의 항아리를 사용하고serialize를 사용하는 방법 Collections.synchronizedList 및 co

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.oxm.MarshallingFailureException: XStream marshalling exception; nested exception is com.thoughtworks.xstream.converters.ConversionException: Could not call java.util.concurrent.ConcurrentHashMap.writeObject() : Could not call java.util.Collections$SynchronizedList.writeObject() : Cannot reference implicit element 
---- Debugging information ---- 
    implicit-element : [EasyMock for class com.pyramid.qls.computeinvoker.Task] 

    referencing-element : /batchProgressMetrics/batchProgressUpdater/context/servletContext/context/attributes/java.util.concurrent.ConcurrentHashMap/org.springframework.web.context.support.XmlWebApplicationContext/servletConfig/config/parent/lifecycle/listeners/org.apache.catalina.core.StandardHost_-MemoryLeakTrackingListener/outer-class/listeners/org.apache.catalina.connector.MapperListener/connector/service/connectors/org.apache.catalina.connector.Connector[2]/container/thread/group/threads/java.lang.Thread/threadLocals/table/java.lang.ThreadLocal_-ThreadLocalMap_-Entry[11]/value/org.easymock.classextension.internal.ClassProxyFactory_-1/val_-handler/delegate/control/state/behavior/behaviorLists/org.easymock.internal.UnorderedBehavior/results/org.easymock.internal.ExpectedInvocationAndResults[4]/results/results/org.easymock.internal.Result/value/val_-value/java.util.Collections_-SynchronizedCollection/default/mutex 
------------------------------- 
message    : Could not call java.util.Collections$SynchronizedList.writeObject() 
cause-exception  : com.thoughtworks.xstream.core.AbstractReferenceMarshaller$ReferencedImplicitElementException 
cause-message  : Cannot reference implicit element 
------------------------------- 
message    : Could not call java.util.concurrent.ConcurrentHashMap.writeObject() 
cause-exception  : com.thoughtworks.xstream.converters.ConversionException 
cause-message  : Could not call java.util.Collections$SynchronizedList.writeObject() : Cannot reference implicit element 
---- Debugging information ---- 
    implicit-element : [EasyMock for class com.pyramid.qls.computeinvoker.Task] 
    referencing-element : /batchProgressMetrics/batchProgressUpdater/context/servletContext/context/attributes/java.util.concurrent.ConcurrentHashMap/org.springframework.web.context.support.XmlWebApplicationContext/servletConfig/config/parent/lifecycle/listeners/org.apache.catalina.core.StandardHost_-MemoryLeakTrackingListener/outer-class/listeners/org.apache.catalina.connector.MapperListener/connector/service/connectors/org.apache.catalina.connector.Connector[2]/container/thread/group/threads/java.lang.Thread/threadLocals/table/java.lang.ThreadLocal_-ThreadLocalMap_-Entry[11]/value/org.easymock.classextension.internal.ClassProxyFactory_-1/val_-handler/delegate/control/state/behavior/behaviorLists/org.easymock.internal.UnorderedBehavior/results/org.easymock.internal.ExpectedInvocationAndResults[4]/results/results/org.easymock.internal.Result/value/val_-value/java.util.Collections_-SynchronizedCollection/default/mutex 
------------------------------- 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:659) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 

. 그것에 더하여 나는 xstream-1.3.1과 xpp4-1.1.4를 사용하고있다. 저를 도와주세요. 또한 이것이 봄의 한계라면, 나는 당신이 행동에서 편안한 webservice를 찾을 수있는 몇 가지 예제를 통해 나를 안내 해줄 수 있습니까? jaxb를 사용하는 예제를 보았지만 인터페이스를 지원하지 않는 문제가있었습니다. 다음은이 내가 컨트롤러

@RequestMapping(value = "/clientMetrics/{clientId}", method = RequestMethod.GET) 
    public ModelAndView getBatchProgressMetrics(@PathVariable String clientId) { 
     List<BatchProgressMetrics> batchProgressMetricsList = null; 
     batchProgressMetricsList = batchProgressReporter.getBatchProgressMetricsForClient(clientId); 
     ModelAndView mav = new ModelAndView("QPRXmlView", BindingResult.MODEL_KEY_PREFIX + "batchProgressMetrics", batchProgressMetricsList.get(0)); 
     return mav; 
    } 
And on BatchProgressMetrics (is an interface) object i do have annotation: 
    @XStreamAlias("batchProgressMetrics") 
    public class BatchProgressMetricsImpl implements BatchProgressMetrics 
+1

봄 3.0.0.RC3은 대단히 * 최신 버전이 아닙니다. Spring은 현재 3.0.5 릴리스입니다. 그게 문제는 아니지만 스프링의 시험판 버전을 사용할 이유가 없습니다. – skaffman

+0

사과. JDK1.6에서는 3.0.5.RELEASE를 사용하고 있습니다. 사실 나는이 excetion이 새로운 버전일지도 모르므로 이전 버전으로 되 돌리려고 시도하고 동일한 오류가 발생했습니다. – Ajay

답변

0

이는 XStream을 문제보다는 봄처럼 보이는이 무엇인지 내 서블릿 XML






에서 예외입니다.

  • 당신이 응답으로 보내는 객체가 XStream을 주석 주석되어 있는지 확인합니다 (예에서와 같이) detectannotations가 true로 설정되어 있는지 확인하십시오에서 몇 가지 볼 수 있습니다. 또한

문제가 정말 동기화 된 컬렉션 (I 의심되는) 작동하지 않는 경우 (최신 vesrsion를 실행하지 않는 경우), 다음 새를 만들 수 있습니다 방법에서 반환하기 전에 XStream을 업그레이드 컬렉션 - new ArrayList(syncedList). 와이어를 통해 전송할 때 결과가 동기화 될 필요는 없습니다.

+0

그래, 나는 사실로 detectannotations가 : 다음은 XML 발췌문 <생성자 -arg> 이것은 내가 컨트롤러에 가지고있는 것입니다 – Ajay

+0

새로운 ArrayList (synclist) 다른 팀에 의해 나는 그것을 수정할 수 없다. – Ajay