Как использовать serialize Collections.synchronizedList и co - PullRequest
1 голос
/ 08 января 2011

Я начинающий веб-сервис.Я пытался написать Restful webservice, и я следовал http://www.stupidjavatricks.com/?p=54. Этот пример работает для меня.Но когда я попытался реализовать то же самое в моей кодовой базе, это не удалось, за исключением следующего:

    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)  

Я использую последнюю версию 3.0.5. RELEASE jars на windows.В дополнение к этому я использую xstream-1.3.1 и xpp4-1.1.4.Не могли бы вы мне помочь.Также, если это ограничение Spring, можете ли вы привести меня к некоторым примерам, где я могу найти спокойный веб-сервис в действии.Я видел примеры использования jaxb, но проблема была в том, что он не поддерживает интерфейс.Ниже приводится исключение из моего сервлета xml






Это то, что у меня есть в контроллере

    @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 Ответ

0 голосов
/ 08 января 2011

Это похоже на проблему XStream, а не на весну. Несколько вещей, на которые нужно посмотреть:

  • убедитесь, что для detectannotations установлено значение true (как в примере)
  • убедитесь, что объекты, отправляемые вами в качестве ответа, помечены аннотациями XStream.

Также обновите XStream (если не работает последняя версия)

Если проблема в том, что синхронизированные коллекции не работают (в чем я сомневаюсь), то прежде чем вернуться к своим методам, вы можете создать новую коллекцию из - new ArrayList(syncedList). Результат не нужно синхронизировать при отправке по проводам.

...