首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dozer寻求xml信任,而不是Java信任

Dozer寻求xml信任,而不是Java信任
EN

Stack Overflow用户
提问于 2020-12-23 10:03:31
回答 1查看 164关注 0票数 0

我正在使用Spring、Gradle和Oracle开发一个Spring项目,在这个项目中,我使用DozerBeanMapper将实体映射到DTO,反之亦然,我不对Dozer使用xml,只使用Java配置:

代码语言:javascript
复制
@Slf4j
@Configuration
public class DozerConfig {
    @Bean
    public DozerBeanMapper getDozerMapper() {
        log.info("Initializing DozerBeanMapper bean");
        return new DozerBeanMapper();
    }
}

另外,为了清晰起见,我已经显式地配置了所有必须映射的字段,尽管它们都有相同的名称。例如,我的客户映射程序:

代码语言:javascript
复制
@Slf4j
@Component
public class ClientMapper extends BaseMapper {

    private BeanMappingBuilder builder = new BeanMappingBuilder() {
        @Override
        protected void configure() {
            mapping(Client.class, ClientDTO.class)
                    .fields("id", "id")
                    .fields("name", "name")
                    .fields("midName", "midName")
                    .fields("surname", "surname")
                    .exclude("password")
                    .fields("phone", "phone")
                    .fields("email", "email")
                    .fields("address", "address")
                    .fields("idCardNumber", "idCardNumber")
                    .fields("idCardIssueDate", "idCardIssueDate")
                    .fields("idCardExpirationDate", "idCardExpirationDate")
                    .fields("bankAccounts", "bankAccounts")
                    .fields("accountManager", "accountManager")
                    .fields("debitCardNumber", "debitCardNumber")
                    .fields("creditCardNumber", "creditCardNumber")
                    .fields("dateCreated", "dateCreated")
                    .fields("dateUpdated", "dateUpdated");
        }
    };

    @Autowired
    public ClientMapper(DozerBeanMapper mapper) {
        super(mapper);
        mapper.addMapping(builder);
    }

    public ClientDTO toDto(Client entity) {
        log.info("Mapping Client entity to DTO");
        return mapper.map(entity, ClientDTO.class);
    }

    public Client toEntity(ClientDTO dto) {
        log.info("Mapping Client DTO to entity");
        return mapper.map(dto, Client.class);
    }

    public List<ClientDTO> toDtos(List<Client> entities) {
        log.info("Mapping Client entities to DTOs");
        return entities.stream()
                       .map(entity -> toDto(entity))
                       .collect(Collectors.toList());
    }

    public List<Client> toEntities(List<ClientDTO> dtos) {
        log.info("Mapping Client DTOs to entities");
        return dtos.stream()
                   .map(dto -> toEntity(dto))
                   .collect(Collectors.toList());
    }

    public EmployeeDTO toEmployeeDto(Employee entity) {
        log.info("Mapping Employee entity to DTO");
        return mapper.map(entity, EmployeeDTO.class);
    }

    public Employee toEmployeeEntity(EmployeeDTO dto) {
        log.info("Mapping Employee DTO to entity");
        return mapper.map(dto, Employee.class);
    }

    public List<EmployeeDTO> toEmployeeDtos(List<Employee> entities) {
        log.info("Mapping Employee entities to DTOs");
        return entities.stream()
                .map(entity -> toEmployeeDto(entity))
                .collect(Collectors.toList());
    }

    public List<Employee> toEmployeeEntities(List<EmployeeDTO> dtos) {
        log.info("Mapping Employee DTOs to entities");
        return dtos.stream()
                .map(dto -> toEmployeeEntity(dto))
                .collect(Collectors.toList());
    }
}

尽管如此,我还是得到了以下例外:

代码语言:javascript
复制
"httpStatus": "500 Internal Server Error",
    "exception": "java.lang.IllegalArgumentException",
    "message": "setAttribute(name, value):\n  name: "http://apache.org/xml/features/validation/schema\"\n  value: \"true\"",
    "stackTrace": [
        "oracle.xml.jaxp.JXDocumentBuilderFactory.setAttribute(JXDocumentBuilderFactory.java:289)",
    "org.dozer.loader.xml.XMLParserFactory.createDocumentBuilderFactory(XMLParserFactory.java:71)",
        "org.dozer.loader.xml.XMLParserFactory.createParser(XMLParserFactory.java:50)",
        "org.dozer.loader.xml.MappingStreamReader.<init>(MappingStreamReader.java:43)",
        "org.dozer.loader.xml.MappingFileReader.<init>(MappingFileReader.java:44)",
        "org.dozer.DozerBeanMapper.loadFromFiles(DozerBeanMapper.java:219)",
        "org.dozer.DozerBeanMapper.loadCustomMappings(DozerBeanMapper.java:209)",
        "org.dozer.DozerBeanMapper.initMappings(DozerBeanMapper.java:315)",
        "org.dozer.DozerBeanMapper.getMappingProcessor(DozerBeanMapper.java:192)",
        "org.dozer.DozerBeanMapper.map(DozerBeanMapper.java:120)",
        "com.rosenhristov.bank.exception.mapper.ClientMapper.toDto(ClientMapper.java:52)",
       "com.rosenhristov.bank.service.ClientService.lambda$getClientById$0(ClientService.java:27)",
        "java.base/java.util.Optional.map(Optional.java:265)",
        "com.rosenhristov.bank.service.ClientService.getClientById(ClientService.java:27)",
        "com.rosenhristov.bank.controller.ClientController.getClientById(ClientController.java:57)",
        "java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)",
        "java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)",
        "java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)",
        "java.base/java.lang.reflect.Method.invoke(Method.java:566)",
        "org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197)",
        "org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141)",
        "org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)",
        "org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:893)",
        "org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:807)",
        "org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)",
        "org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061)",
        "org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961)",
        "org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)",
        "org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)",
        "javax.servlet.http.HttpServlet.service(HttpServlet.java:626)",
        "org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)",
        "javax.servlet.http.HttpServlet.service(HttpServlet.java:733)",
        "org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)",
        "org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)",
        "org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)",
        "org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)",
        "org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)",
        "org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)",
        "org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)",
        "org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)",
        "org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)",
        "org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)",
        "org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)",
        "org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)",
        "org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)",
        "org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:93)",
        "org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)",
        "org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)",
        "org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)",
        "org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)",
        "org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)",
        "org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)",
        "org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)",
        "org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)",
        "org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)",
        "org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)",
        "org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)",
        "org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)",
        "org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)",
        "org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)",
        "org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)",
        "org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)",
        "org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)",
        "org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)",
        "org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)",
        "java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)",
        "java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)",
        "org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)",
        "java.base/java.lang.Thread.run(Thread.java:834)"
]

似乎Dozer正在试图找到一些xml conffig文件,考虑到这一点:

"oracle.xml.jaxp.JXDocumentBuilderFactory.setAttribute(JXDocumentBuilderFactory.java:289)“

它似乎正在搜索一个xml验证模式(看看下面图片中的var1 ):

在启动应用程序时,我在IntelliJ控制台中看到了以下内容:

代码语言:javascript
复制
Trying to find Dozer configuration file: dozer.properties
2020-12-23 11:46:09.855  WARN 17488 --- [  restartedMain] org.dozer.config.GlobalSettings: Dozer configuration file not found: dozer.properties.  Using defaults for all Dozer global properties.

也许我必须搜索dozer.properties并了解如何使它看起来像Java?

有人能帮帮我吗?我在网上寻找了一些解决方案,但仍然没有找到合适的解决方案。我是Dozer的新手,我以前用过Mapstruct吗?

EN

回答 1

Stack Overflow用户

发布于 2021-01-08 04:36:58

您可以尝试我的豆刀自动生成dto文件。它将有一个read方法将实体转换为dto。虽然没有从dto到实体的转换,但我认为在大多数情况下您不需要它。

代码语言:javascript
复制
@ViewOf(value = Client.class, genName = "ClientDto", includePattern = ".*")
class ClientDtoConfiguration {}

然后,它将生成一个名为"ClientDto“的dto类,其中包含了客户端的所有属性。

代码语言:javascript
复制
Client client = ...
ClientDto clientDto = ClientDto.read(client);
List<Client> clients = ...
List<ClientDto> clientDtos = ClientDto.read(clients);

然后序列化dtos而不是实体。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65422398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档