Dozer MappingException NoSuchMethodException init

Я в коде проекта. У меня возникла ошибка при попытке преобразовать тип объекта RRREC в тип RR_REC.

Класс RRREC:

 public class RRREC{
    protected String owner;
    protected RRINFRATYPE infraType;
    // getter and setter
 }

Класс RR_REC:

public class RR_REC{
    protected String localOwner;
    protected RR_INFRA_TYPE localInfraType;
    // getter and setter
}

Класс RRINFRATYPE:

public enum RRINFRATYPE {

  V_6_ADDRESS("V6ADDRESS"),
  OBJECT("OBJECT"),
  ZONE("ZONE"),
  V_4_REVERSEZONE("V4REVERSEZONE"),
  V_6_REVERSEZONE("V6REVERSEZONE"),
  NODE("NODE"),
  ALL("ALL");
  private final String value;

  RRINFRATYPE(String v) {
     value = v;
  }

  public String value() {
    return value;
  }

  public static RRINFRATYPE fromValue(String v) {
    for (RRINFRATYPE c: RRINFRATYPE.values()) {
        if (c.value.equals(v)) {
            return c;
        }
    }
    throw new IllegalArgumentException(v);
   }
}

И RR_INFRA_TYPE:

public class RR_INFRA_TYPE{
   protected String localRR_INFRA_TYPE;
   private static java.util.HashMap _table_ = new java.util.HashMap();

   // Constructor
   protected RR_INFRA_TYPE(String value, boolean isRegisterValue) {
    localRR_INFRA_TYPE = value;
    if (isRegisterValue) {
        _table_.put(localRR_INFRA_TYPE, this);
    }
}

Когда я отлаживаю код

// getMapper will return DozerBeanMapper object
// and request is a RRREC object
getMapper().map(request, RR_REC.class);

Я получил ошибку, ниже трассировка стека

Nov 17, 2015 2:46:44 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [RESTfulServlet] in context with path [] threw exception [Request processing failed; nested exception is org.dozer.MappingException: java.lang.NoSuchMethodException: com.qip.nb.ws.RR_INFRA_TYPE.<init>()] with root cause
java.lang.NoSuchMethodException: com.qip.nb.ws.RR_INFRA_TYPE.<init>()
at java.lang.Class.getConstructor0(Unknown Source)
at java.lang.Class.getDeclaredConstructor(Unknown Source)
at org.dozer.factory.ConstructionStrategies$ByConstructor.newInstance(ConstructionStrategies.java:257)
at org.dozer.factory.ConstructionStrategies$ByConstructor.create(ConstructionStrategies.java:245)
at org.dozer.factory.DestBeanCreator.create(DestBeanCreator.java:65)
at org.dozer.MappingProcessor.mapCustomObject(MappingProcessor.java:477)
at org.dozer.MappingProcessor.mapOrRecurseObject(MappingProcessor.java:434)
at org.dozer.MappingProcessor.mapFromFieldMap(MappingProcessor.java:330)
at org.dozer.MappingProcessor.mapField(MappingProcessor.java:276)
at org.dozer.MappingProcessor.map(MappingProcessor.java:245)
at org.dozer.MappingProcessor.map(MappingProcessor.java:187)
at org.dozer.MappingProcessor.map(MappingProcessor.java:124)
at org.dozer.MappingProcessor.map(MappingProcessor.java:119)
at org.dozer.DozerBeanMapper.map(DozerBeanMapper.java:111)
at com.qip.nb.ws.restful.controller.RRController.buildSOAPRequest(RRController.java:488)
at com.qip.nb.ws.restful.controller.RRController.getRRs(RRController.java:374)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
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:776)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:858)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:151)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at com.qip.nb.ws.restful.security.AuthenticationTokenProcessingFilter.doFilter(AuthenticationTokenProcessingFilter.java:52)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)

person Tam Nguyen    schedule 17.11.2015    source источник
comment
поэтому Dozer ожидает КОНСТРУКТОР ПО УМОЛЧАНИЮ, а у вас его нет. Так добавь один...   -  person Neil Stockton    schedule 17.11.2015


Ответы (2)


Dozer обычно ожидает конструктор по умолчанию. В вашем классе RR_INFRA_TYPE его нет, поскольку вы определили конструктор, отличный от конструктора по умолчанию.

Чтобы сообщить dozer, как создать экземпляр вашего целевого класса, вы должны реализовать собственную фабрику компонентов. Там вы можете инициализировать все параметры, необходимые для вашего объекта RR_INFRA_TYPE, и тогда этот экземпляр будет обработан/заполнен дозером.

Дополнительная информация здесь: http://dozer.sourceforge.net/documentation/custombeanfactories.html

person Aron_dc    schedule 17.11.2015
comment
Я использовал аннотацию @AllArgsConstructor из lombok в своем классе представления. когда я добавил @NoArgsConstructor, ошибка исправлена. Спасибо за Ваш ответ. - person Ali Sohrabi; 17.05.2019

Я получил ту же ошибку, используя Dozer с внутренним классом, написанным для теста JUnit. Ничто из того, что я пробовал, не устранило бы эту ошибку (Lombok @NoArgConstructor, явный конструктор по умолчанию, полные имена классов, уровни доступа и т. д.).

Единственное, что исправляло это, - это перемещение внутренних классов в их собственные явные файлы классов. Это немедленно решило проблему, несмотря на любую комбинацию предыдущих изменений.

Так что, если вы окажетесь в такой же ситуации, и ничего не помогает, вы можете вернуться к этому.

person Marquee    schedule 27.08.2019
comment
Это странно. В моем случае с внутренним классом, только в этом, я добавил Lombok NoArgsConstructor и AllArgsConstructor. И работает без проблем - person Sebastian Farias; 10.12.2019
comment
Себастьян Фариас, я согласен, что это не имеет смысла — отсюда и квалификатор «если все остальное не работает». Рад, что это сработало для вас - если кто-нибудь еще знает, почему это не сработает в JUnit с внутренними классами и / или имеет решение, я бы хотел его услышать. - person Marquee; 29.12.2020