当前位置: 首页 > 知识库问答 >
问题:

Spring ModelMapper错误:控制器已经存在映射

南门新知
2023-03-14

我通过DTO从表单中获取数据,并将其映射到Hibernate实体。我想跳过一个日期字段,因为传入的数据都是字符串,我需要将字符串字段转换为与其他字段分开的日期。其余字段将直接从传入DTO映射。对于第一个请求,该过程可以正常工作,但对于后续请求,会引发以下异常:

     1) A mapping already exists for com.ibm.calypso.entity.WmCompIdfn.setEffStartDate().

1 error
    at org.modelmapper.internal.Errors.toConfigurationException(Errors.java:250)
    at org.modelmapper.internal.TypeMapImpl.addMappings(TypeMapImpl.java:76)
    at org.modelmapper.internal.TypeMapStore.getOrCreate(TypeMapStore.java:110)
    at org.modelmapper.ModelMapper.addMappings(ModelMapper.java:93)
    at com.ibm.calypso.service.CompanyServiceImpl.updateIdentificationIdfn(CompanyServiceImpl.java:48)
    at com.ibm.calypso.controller.CompanyController.updateIdentificationIdfn(CompanyController.java:76)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    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.invokeHandlerMethod(RequestMappingHandlerAdapter.java:806)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:729)
    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:970)
    at org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:883)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:651)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at com.ibm.calypso.filter.CORSFilter.doFilterInternal(CORSFilter.java:29)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2500)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2489)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

这个错误已经被提出,但似乎没有人对此作出回应。

https://github.com/jhalterman/modelmapper/issues/103

我的代码结构与链接中的代码结构相似。

共有3个答案

卫昊东
2023-03-14

我知道这是一个老问题,但我也有同样的错误,但原因可能不同。下面是导致问题的代码:

private static final ModelMapper mapper = new ModelMapper();
{
    PropertyMap<SomeSourceClass, SomeTargetClass> map =
        new PropertyMap<SomeSourceClass, SomeTargetClass>() {
            @Override
            protected void configure() {
                // my configuration
            }
        };
    mapper.addMappings(map);
}

问题是ModelMapper是一个静态字段,但是每次创建这个类的新对象时,我的初始化都会发生,正确的代码使用静态初始化器来代替:

private static final ModelMapper mapper = new ModelMapper();
static {
    PropertyMap<SomeSourceClass, SomeTargetClass> map =
        new PropertyMap<SomeSourceClass, SomeTargetClass>() {
            @Override
            protected void configure() {
                // my configuration
            }
        };
    mapper.addMappings(map);
}

希望这能帮助有同样问题的人!

解浩渺
2023-03-14

上述变通方法有效,但有以下条件:

if(typeMap==null){modelMapper.addMappings(myPropertyMap);}

With not null条件映射将永远不会添加到modelMapper。

公孙巴英
2023-03-14

我不确定你是否已经找到了解决办法。但为了克服这个问题,我做了一些变通。我在做modelMapper。在我的服务方法中添加映射(myPropertymap)。因此,它尝试为每个传入请求添加映射。我添加了下面的检查,以确保它仅在映射不存在时添加

// Before
modelMapper.addMappings(myPropertyMap);


// After
TypeMap<Source, Dest> typeMap = modelMapper.getTypeMap(Source.class, Dest.class);
if (typeMap == null) { // if not  already added
   modelMapper.addMappings(myPropertyMap);
}
 类似资料:
  • 我一直在犯这个错误 你们可以看到,我的项目里有那个文件。 我还尝试重新启动我的本地MAMP服务器并清除缓存 我也做了 请让我知道我还能做什么。 路线 route::get(“/”,function(){return redirect::to(“/baby/signin”);});route::get(“/baby/signin”,“BabyAccountController@signin”);

  • 我收到以下错误,我不确定为什么,因为我直接从模板中运行代码。有人在堆栈跟踪中看到了我没有看到的东西吗?它贴在下面。 “/Cfia中的服务器错误。网状物MVC模板。示例的应用。 远程服务器返回错误:(404)未找到。 描述:在执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源。 异常详细信息:System. Net. WebException:远程服

  • 块(2个级别)in 'tasks:TOP=>db:migrate(请参阅通过运行任务与--trace进行完整跟踪) 我不知道这怎么可能,因为在方案文件中我没有张贴表。

  • 可能的异常 关于 FreeMarker 发生的异常,可以分为如下几类: 当配置 FreeMarker 时发生异常:典型地情况,就是在应用程序初始化时, 仅仅配置了一次 FreeMarker。在这个过程中,异常就会发生, 从 FreeMarker 的API中,我们可以很清楚的看到这一点... 当加载和解析模板时发生异常:调用了 Configuration.getTemplate(...) 方法, F

  • 我是symfony的新手,正在学习登录表单教程(https://symfony.com/doc/2.8/cookbook/security/form_login_setup.html)但我得到了以下错误: 我使用相同的SecurityController: security.yml 安全:

  • 问题内容: 我希望能够控制基于iframe的YouTube播放器。该播放器已经存在于HTML中,但是我想通过JavaScript API对其进行控制。 我一直在阅读iframeAPI的文档,其中解释了如何使用API​​向页面添加新视频,然后使用YouTube播放器功能对其进行控制: 该代码创建了一个新的播放器对象,并将其分配给“player”,然后将其插入#containerdiv中。然后,我可以