2016-07-08 16 views
0

페이지 개체를 페이지 개체에 매핑하는 데 문제가 있습니다. 나는 다음 매퍼 클래스가 있습니다Orika -지도 페이지 페이지로

package com.agileplayers.agilemanager.core.mapper; 

import com.agileplayers.agilemanager.core.domain.Account; 
import com.agileplayers.agilemanager.core.domain.Entry; 
import com.agileplayers.agilemanager.core.dto.AccountDto; 
import com.agileplayers.agilemanager.core.dto.EntryDto; 
import ma.glasnost.orika.MapperFacade; 
import ma.glasnost.orika.MapperFactory; 
import ma.glasnost.orika.impl.DefaultMapperFactory; 
import ma.glasnost.orika.metadata.TypeBuilder; 
import org.springframework.data.domain.PageImpl; 
import org.springframework.stereotype.Component; 


@Component 
public class Mapper { 
    final static MapperFactory MAPPER_FACTORY = new DefaultMapperFactory.Builder().build(); 

    public MapperFacade getMapperFacade(){ 
     registerMappers(); 
     return MAPPER_FACTORY.getMapperFacade(); 
    } 

    private void registerMappers(){ 
     MAPPER_FACTORY.classMap(Entry.class, EntryDto.class) 
       .byDefault() 
       .register(); 

     MAPPER_FACTORY.classMap(Account.class, AccountDto.class) 
       .byDefault() 
       .register(); 
     MAPPER_FACTORY.classMap(
       new TypeBuilder<PageImpl<Entry>>() {}.build(), 
       new TypeBuilder<PageImpl<EntryDto>>() {}.build()) 
       .byDefault() 
       .register(); 

    } 
} 

여기에 사용되는 : 불행하게도

@Autowired 
    private EntryRepository entryRepository; 

    private void start() { 
     Mapper mapper = new Mapper(); 
     Page<Entry> entryPage = entryRepository.findAll(new PageRequest(0, 2)); 

     Type<Page<Entry>> pageEntryType = new TypeBuilder<Page<Entry>>() { 
     }.build(); 
     Type<Page<EntryDto>> pageEntryDtoType = new TypeBuilder<Page<EntryDto>>() { 
     }.build(); 

     Page<EntryDto> entryDtoPage = mapper.getMapperFacade().map(entryPage, pageEntryType, pageEntryDtoType); 

을, 나는 수신하고 다음

Exception in thread "main" ma.glasnost.orika.MappingException: While attempting the following mapping: 
sourceClass = class org.springframework.data.domain.PageImpl 
sourceType = org.springframework.data.domain.Page<Entry> 
destinationType = org.springframework.data.domain.Page<EntryDto> 
resolvedStrategy = InstantiateAndUseCustomMapperStrategy<PageImpl<Entry>, PageImpl<EntryDto>> {customMapper: GeneratedMapper<PageImpl<Entry>, PageImpl<EntryDto>> {usedConverters: [], usedMappers: [], usedMapperFacades: [DefaultBoundMapperFacade<Sort, Sort>], usedTypes: [Object] }, unenhancer: [email protected], objectFactory: ma.glasnost.orika.genera[email protected]2dd2ff87} 
Error occurred: java.lang.UnsupportedOperationException 
-----begin dump of current state----------------------------- 
Registered object factories: 3 (approximate size: 9,541.1 kB) 
    [AccountDto] : {Account=DefaultConstructorObjectFactory<AccountDto>} 
    [PageImpl<EntryDto>] : {PageImpl<Entry>=ma.glasnost.orika.genera[email protected]2dd2ff87} 
    [EntryDto] : {Entry=DefaultConstructorObjectFactory<EntryDto>} 
------------------------------------------------------------- 
Registered mappers: 3 (approximate size: 9,794.2 kB) 
    [0] : GeneratedMapper<PageImpl<Entry>, PageImpl<EntryDto>> {usedConverters: [], usedMappers: [], usedMapperFacades: [DefaultBoundMapperFacade<Sort, Sort>], usedTypes: [Object] } 
    [1] : GeneratedMapper<Entry, EntryDto> {usedConverters: [builtin:CloneableConverter(Copy by cloning:Date, Calendar, XMLGregorianCalendar)], usedMappers: [], usedMapperFacades: [DefaultBoundMapperFacade<Account, AccountDto>], usedTypes: [Date] } 
    [2] : GeneratedMapper<Account, AccountDto> {usedConverters: [builtin:CloneableConverter(Copy by cloning:Date, Calendar, XMLGregorianCalendar)], usedMappers: [], usedMapperFacades: [], usedTypes: [Date, Entry, EntryDto] } 
------------------------------------------------------------- 
Registered concrete types: 6 (approximate size: 346.9 kB) 
    [interface java.util.Collection] : ArrayList<Object> 
    [interface java.util.Map] : LinkedHashMap<Object, Object> 
    [interface java.util.Map$Entry] : MapEntry<Object, Object> 
    [Page<Entry>] : PageImpl<EntryDto> 
    [interface java.util.List] : ArrayList<Object> 
    [interface java.util.Set] : LinkedHashSet<Object> 
------------------------------------------------------------- 
Resolved strategies: 4 (approximate size: 9,794.6 kB) 
{source: PageImpl, dest: Page<EntryDto>, in-place:false}: InstantiateAndUseCustomMapperStrategy<PageImpl<Entry>, PageImpl<EntryDto>> {customMapper: GeneratedMapper<PageImpl<Entry>, PageImpl<EntryDto>> {usedConverters: [], usedMappers: [], usedMapperFacades: [DefaultBoundMapperFacade<Sort, Sort>], usedTypes: [Object] }, unenhancer: [email protected], objectFactory: ma.glasnost.orika.genera[email protected]2dd2ff87} 
{source: Account, dest: AccountDto, in-place:false}: InstantiateAndUseCustomMapperStrategy<Account, AccountDto> {customMapper: GeneratedMapper<Account, AccountDto> {usedConverters: [builtin:CloneableConverter(Copy by cloning:Date, Calendar, XMLGregorianCalendar)], usedMappers: [], usedMapperFacades: [], usedTypes: [Date, Entry, EntryDto] }, unenhancer: [email protected], objectFactory: DefaultConstructorObjectFactory<AccountDto>} 
{source: Entry, dest: Object, in-place:false}: InstantiateAndUseCustomMapperStrategy<Entry, EntryDto> {customMapper: GeneratedMapper<Entry, EntryDto> {usedConverters: [builtin:CloneableConverter(Copy by cloning:Date, Calendar, XMLGregorianCalendar)], usedMappers: [], usedMapperFacades: [DefaultBoundMapperFacade<Account, AccountDto>], usedTypes: [Date] }, unenhancer: [email protected], objectFactory: DefaultConstructorObjectFactory<EntryDto>} 
{source: Entry, dest: EntryDto, in-place:false}: InstantiateAndUseCustomMapperStrategy<Entry, EntryDto> {customMapper: GeneratedMapper<Entry, EntryDto> {usedConverters: [builtin:CloneableConverter(Copy by cloning:Date, Calendar, XMLGregorianCalendar)], usedMappers: [], usedMapperFacades: [DefaultBoundMapperFacade<Account, AccountDto>], usedTypes: [Date] }, unenhancer: [email protected], objectFactory: DefaultConstructorObjectFactory<EntryDto>} 
------------------------------------------------------------- 
Unenhance strategy: [email protected] 
-----end dump of current state------------------------------- 
    at ma.glasnost.orika.impl.ExceptionUtility.newMappingException(ExceptionUtility.java:55) 
    at ma.glasnost.orika.impl.MapperFacadeImpl.map(MapperFacadeImpl.java:280) 
    at ma.glasnost.orika.impl.MapperFacadeImpl.map(MapperFacadeImpl.java:243) 
    at ma.glasnost.orika.impl.MapperFacadeImpl.map(MapperFacadeImpl.java:133) 
    at com.agileplayers.agilemanager.AgileManagerApplication.start(AgileManagerApplication.java:49) 
    at com.agileplayers.agilemanager.AgileManagerApplication.main(AgileManagerApplication.java:34) 
    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 com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 
Caused by: java.lang.UnsupportedOperationException 
    at java.util.Collections$UnmodifiableCollection.clear(Collections.java:1074) 
    at ma.glasnost.orika.generated.Orika_PageImpl_PageImpl_Mapper5970055563717$0.mapAtoB(Orika_PageImpl_PageImpl_Mapper5970055563717$0.java) 
    at ma.glasnost.orika.impl.mapping.strategy.UseCustomMapperStrategy.map(UseCustomMapperStrategy.java:67) 
    at ma.glasnost.orika.impl.MapperFacadeImpl.map(MapperFacadeImpl.java:266) 
    ... 9 more 

가 매핑 항목에 아무 문제가 없다 EntryDto 또는 List to List. 나는 문제가 PageImpl 클래스에서 매개 변수없는 생성자와 함께있을 것이라고 생각하지만 그것은 단지 나의 의심이다. 내가 뭘 잘못하고 있는지 조언 해주세요.

+0

왜 그렇게 복잡합니까? 'Page'에는'map' 메쏘드가 있습니다 (스프링 데이터를 공통 1.10 이상으로 사용한다면). 당신은 단지 매핑을 수행하고 그것으로 끝나야하는 함수를 전달할 필요가 있습니다. 여러분은 그것을 복잡하게 만듭니다. –

답변

3

스프링 데이터 커먼스 1.10 이상을 사용하는 경우 Page 객체는 map 메소드를가집니다. 그것을 당신의 이익에 사용하십시오.

다음 샘플에서는 실제로 사용하고 있다고 가정합니다.

private void start() { 
    final Mapper mapper = new Mapper(); 
    Page<Entry> entryPage = entryRepository.findAll(new PageRequest(0, 2)); 
    Page<EntryDto> entryDtoPage = entryPage.map(
     new Converter<Entry, EntryDto>() { 
      public EntryDto convert(Entry source) { 
       mapper.getMapperFacade().map(source, EntryDto); 
      } 
    }); 

실제 페이지를 매핑/해킹/재구성하려는 다른 코드를 제공 할 필요가 없습니다. JDK8에서는 코드를 더 작게 만드는 멋진 lamda로 대체 할 수 있습니다.

+0

저는 .NET 세상에서 자바를 처음 접했습니다. 고맙습니다! 완벽하게 작동합니다! – kbysiec