2015-03-20 2 views
0

Я пытаюсь создать новый экземпляр из объекта inmutable. В этом случае, это список, и я получаю эту ошибку:Как создать экземпляр из объектов, которые можно использовать?

java.lang.InstantiationException: java.util.Collections$UnmodifiableRandomAccessList 
    at java.lang.Class.newInstance(Class.java:364) 
    at com.example.movies.domain.transformer.DomainEntityTransformer.transformEntityArray(DomainEntityTransformer.java:32) 
    at com.example.movies.domain.service.client.impl.ClientServiceImpl.getClients(ClientServiceImpl.java:58) 
    at com.example.movies.service.controller.ClientController.getClients(ClientController.java:50) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:777) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:706) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:618) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659) 
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 

Это класс трансформатора, где исключение было брошено

public Collection<DOM> transformEntityArray(Collection<ENT> iterable) { 
    try { 
     Collection<DOM> transformed = iterable.getClass().newInstance(); 
     Iterator<ENT> iterator = iterable.iterator(); 
     while (iterator.hasNext()) { 
      ENT element = iterator.next(); 
      transformed.add(this.transformEntity(element)); 
     } 
     return transformed; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

Это реализация

Page<Client> clientsEntity = this.dao.findAll(new PageRequest(offset, limit)); 
List<ClientDomain> clientsDomain = (List<ClientDomain>) this.transformer.transformEntityArray(clientsEntity 
    .getContent()); 

Вы знаете людей, как это исправить? С уважением!

ответ

1

Да, мы делаем

transformed = new ArrayList<>(); 

И вообще (даже если он не имеет никакого смысла в вашем случае), вы можете создать inmutable объектов, вызвав appropriete конструктора со всеми необходимыми параметрами для установки состояния из объект.

В вашем случае это UnmodifiableRandomAccessList(List<? extends E> list), , который вы можете получить доступ с помощью getClass().getConstructor... (и вы по-прежнему необходимо временно ArrayList для хранения результатов).

, но вы не можете предоставить общее решение, которое будет работать для любой коллекции ввода, так как вам нужно знать, какой contructor для вызова == знать код Java фактических параметров вызова. Что делает использование Genereirc и интерфейсов совершенно бессмысленным.

Итак, просто создайте произвольную выбранную коллекцию (ArrayList), так как она не влияет на дальнейшие части вашего кода.

+0

Да, мы делаем! Как вы думаете, это должно быть частью ответа? ;) – CKing

+0

он чувствовал себя слишком коротким без него – Zielu

+0

Но таким образом я ограничиваю класс возврата только до ArrayList. Я хочу создать экземпляр класса Collections, который я получаю по параметру, так что я мог бы вернуть тот же класс коллекции, а не всегда ArrayList – jscherman