目前我的系統有一個基本接口,其中包含4個映射器方法。Selma映射器泛型轉換BaseMapper <T擴展BaseDomain,D擴展BaseDTO>
構建出錯信息出現後,有人讓我知道它是什麼?我已經嘗試了很多方法,必須將這四種通用方法轉換爲crudservice的某些點。
Error:java: Failed to generate mapping method for type br.com.cron.pdv.domain.Imposto to br.com.cron.pdv.service.service.ImpostoService not supported on br.com.cron.pdv.service.mapper.BaseServiceMapper.asDTO(T) ! --> Add a custom mapper or 'withIgnoreFields' on @Mapper or @Maps to fix this ! If you think this a Bug in Selma please report issue here [ https://github.com/xebia-france/selma/issues] .
下面的BaseMapper:
public interface BaseServiceMapper<T extends BaseDomain, D extends BaseDTO> {
//Server X Domain
T asDomain(D source);
List<T> asDomains(List<D> source);
D asDTO(T source);
List<D> asDTOs(List<T> source);
}
接口擴展:
@Mapper(withIgnoreMissing = IgnoreMissing.ALL, withIoC = IoC.SPRING)
public interface ImpostoMapper extends BaseServiceMapper<Imposto, ImpostoDTO> {
}
我的服務:
public interface ImpostoService extends BaseService<Imposto, Long> {
}
我的服務:
public interface BaseService<T, ID extends Serializable> {
public T salvar(T t);
public List<T> salvar(List<T> t);
public List<T> listarTodos();
public T buscarPor(ID id);
List<T> buscarPorDataAtualizacao(LocalDateTime dataInicial, LocalDateTime dataFinal);
public List<T> listarAtivos();
public void remover(ID id);
public void remover(T t);
public void remover(Iterable<T> iterable);
public void desativar(T t);
public void ativar(T t);
}
我CrudBaseService:
public abstract class CrudController<T extends BaseDomain, D extends BaseDTO, ID extends Serializable> {
protected BaseResponse response;
private BaseService<T, ID> service;
private BaseServiceMapper<T, D> mapper;
public CrudController(BaseService<T, ID> service, BaseServiceMapper<T, D> mapper) {
this.service = service;
this.mapper = mapper;
}
public abstract ResponseEntity<List<T>> listarTodos();
public abstract ResponseEntity<List<T>> listarAtivos();
public abstract ResponseEntity<T> buscar(@PathVariable(ID) Long id);
public abstract ResponseEntity<Void> cadastrar(@ModelAttribute T t, UriComponentsBuilder uriComponentsBuilder);
public abstract ResponseEntity<T> atualizar(@PathVariable(ID) Long id, @ModelAttribute T t);
public abstract RedirectView remover(@PathVariable(ID) Long id);
@RequestMapping(value = REQUEST_MAPPING_INTEGRACAO_DATA, method = RequestMethod.GET)
public ResponseEntity<BaseResponse> buscarPorDataAtualizacao(@RequestParam(name = DATA_INICIAL, required = false) String dataInicial,
@RequestParam(name = DATA_FINAL, required = false) String dataFinal) {
response = new BaseResponse();
if (isNullOrEmpty(dataInicial) || isNullOrEmpty(dataFinal)) {
response.adicionarErro("Existe data(s) vazia(s) ou no formato incorreto");
return createResponse(response);
}
LocalDateTime dtInicial;
LocalDateTime dtFinal;
try {
dtInicial = parseLocaleDateTimeWithoutHour(dataInicial);
dtFinal = parseLocaleDateTimeWithoutHour(dataFinal);
} catch (Exception ex) {
response.adicionarErro(ex.getMessage());
return createResponse(response);
}
List<T> result = service.buscarPorDataAtualizacao(dtInicial, dtFinal);
List<D> resultDTO = null;//mapper.asDTOs(result);
response.setResult(resultDTO);
if (resultDTO.isEmpty()) {
return createResponse(response, HttpStatus.NOT_FOUND);
}
return createResponse(response);
}
ResponseEntity<BaseResponse> createResponse(BaseResponse result) {
return new ResponseEntity<>(result, result.getSucesso() ? HttpStatus.OK : HttpStatus.BAD_REQUEST);
}
ResponseEntity<BaseResponse> createResponse(BaseResponse result, HttpStatus status) {
return new ResponseEntity<>(result, status);
}
}
我的控制器休息:
@RestController
@RequestMapping(ImpostoController.REQUEST_MAPPING_IMPOSTO)
public class ImpostoController extends CrudController<Imposto, ImpostoDTO, Long> {
public static final String REQUEST_MAPPING_IMPOSTO = "imposto";
private ImpostoService impostoService;
private ImpostoMapper mapper;
@Autowired
public ImpostoController(ImpostoService service, ImpostoMapper mapper) {
super(service, mapper);
this.impostoService = service;
this.mapper = mapper;
}
@RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public ResponseEntity<List<Imposto>> listarTodos() {
List<Imposto> impostoList = impostoService.listarTodos();
if (impostoList.isEmpty()) {
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
return new ResponseEntity<>(impostoList, HttpStatus.OK);
}
@Override
@RequestMapping(value = REQUEST_MAPPING_ATIVOS, method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public ResponseEntity<List<Imposto>> listarAtivos() {
List<Imposto> impostoList = impostoService.listarAtivos();
if (impostoList.isEmpty()) {
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
return new ResponseEntity<>(impostoList, HttpStatus.OK);
}
@Override
@RequestMapping(value = REQUEST_MAPPING_ID, method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Imposto> buscar(@PathVariable(ID) Long id) {
Imposto imposto = impostoService.buscarPor(id);
if (imposto == null) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
return new ResponseEntity<>(imposto, HttpStatus.OK);
}
@Override
@RequestMapping(value = REQUEST_MAPPING_CADASTRAR, method = RequestMethod.POST)
public ResponseEntity<Void> cadastrar(@RequestBody Imposto imposto, UriComponentsBuilder uriComponentsBuilder) {
impostoService.salvar(imposto);
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setLocation(uriComponentsBuilder.path(REQUEST_MAPPING_ID).buildAndExpand(imposto.getId()).toUri());
return new ResponseEntity<>(httpHeaders, HttpStatus.CREATED);
}
@Override
@RequestMapping(value = REQUEST_MAPPING_ATUALIZAR, method = RequestMethod.PUT)
public ResponseEntity<Imposto> atualizar(@PathVariable(ID) Long id, @Validated @RequestBody Imposto imposto) {
Imposto impostoEmBanco = impostoService.buscarPor(id);
if (impostoEmBanco == null) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
if (imposto.isSituacao()) impostoEmBanco.ativar();
else impostoEmBanco.desativar();
try {
impostoService.salvar(impostoEmBanco);
} catch (Exception e) {
return new ResponseEntity<>(HttpStatus.EXPECTATION_FAILED);
}
return new ResponseEntity<>(impostoEmBanco, HttpStatus.OK);
}
@Override
@RequestMapping(value = REQUEST_MAPPING_REMOVER, method = RequestMethod.DELETE)
public RedirectView remover(@PathVariable(ID) Long id) {
Imposto imposto = impostoService.buscarPor(id);
impostoService.remover(imposto);
return new RedirectView(REQUEST_MAPPING_IMPOSTO);
}
}