I’m currently doing a proof of concept for an hexagonal architecture in which I have three main modules as the following tree project shows :
Architecture hexagonale/
Business/
Model/
Prm
Ports/
PrmPort (interface)
PrmRepository (interface)
Service/
PrmService (interface)
PrmServiceImpl (implements PrmService)
ServiceFactory (create new PrmServiceImpl)
Exposition
Adapters/
PrmAdapter (implements PrmPort from Business)
Api/
PrmController
Application
ApplicationConfig (@Configuration, @Bean)
Infrastructure
Adapters/
PrmAdapter (implements PrmRepository from Business) : the goal is to convert data retrieved from Database which is Prm (Infrastructure) to Prm (Business type)
Models/
Prm
Repositories/
PrmRepository (interface extends JpaRepository)
The problem I’m trying to solve now is that I need to retrieve data from my database
Architecture_Hexagonale/Infrastructure/Repositories/PrmRepository.java:
package fr.enedis.icam.microapp.sample.business.ports;
import fr.enedis.icam.microapp.sample.business.model.Prm;
import java.util.List;
public interface PrmRepository {
List<Prm> findAll();
}
and to do so I use my PrmAdapter from Infrastructure as following
Architecture_Hexagonale/Infrastructure/Adapters/PrmAdapter.java: **
package fr.enedis.icam.microapp.sample.infrastructure.adapters;
import fr.enedis.icam.microapp.sample.business.model.Prm;
import fr.enedis.icam.microapp.sample.business.ports.PrmRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class PrmAdapter implements PrmRepository {
public fr.enedis.icam.microapp.sample.infrastructure.repositories.PrmRepository repo;
public List<Prm> findAll() {
List<fr.enedis.icam.microapp.sample.infrastructure.models.Prm> infraList = repo.findAll();
List<Prm> toRet = new ArrayList<>();
for (fr.enedis.icam.microapp.sample.infrastructure.models.Prm prm : infraList) {
toRet.add(prm.convert());
}
return toRet;
}
}
The problem is the public fr.enedis.icam.microapp.sample.infrastructure.repositories.PrmRepository repo; is not initialized and returns a NullPointer.** It has to be noted that my business Module doesn't depend of any external components such as databases, framework or any kind of. I already tried something like:
package fr.enedis.icam.microapp.sample.infrastructure.adapters;
import fr.enedis.icam.microapp.sample.business.model.Prm;
import fr.enedis.icam.microapp.sample.business.ports.PrmRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;import java.util.List;
@Service
public class PrmAdapter implements PrmRepository {
@Autowiredprivate fr.enedis.icam.microapp.sample.infrastructure.repositories.PrmRepository repo;
public List<Prm> findAll() {
List<fr.enedis.icam.microapp.sample.infrastructure.models.Prm> infraList = repo.findAll();
List<Prm> toRet = new ArrayList<>();
for (fr.enedis.icam.microapp.sample.infrastructure.models.Prm prm : infraList) {
toRet.add(prm.convert());
}
return toRet;
}
}
package fr.enedis.icam.microapp.sample.application;
import fr.enedis.icam.microapp.sample.application.adapters.PrmAdapter;
import fr.enedis.icam.microapp.sample.business.ports.PrmPort;
import fr.enedis.icam.microapp.sample.business.ports.PrmRepository;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@Configuration
//@EnableJpaRepositories(basePackages = “fr.enedis.icam.microapp.sample.infrastructure.repositories”)
public class ApplicationConfig {
@Bean public PrmPort prmPort() {
return new PrmAdapter();
}
@Bean public PrmRepository prmRepository(){
return new fr.enedis.icam.microapp.sample.infrastructure.adapters.PrmAdapter();
}
}
But this method gives me missing bean for repository. I also tried using
package fr.enedis.icam.microapp.sample.application;
import fr.enedis.icam.microapp.sample.application.adapters.PrmAdapter;
import fr.enedis.icam.microapp.sample.business.ports.PrmPort;
import fr.enedis.icam.microapp.sample.business.ports.PrmRepository;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@Configuration@EnableJpaRepositories(basePackages = “fr.enedis.icam.microapp.sample.infrastructure.repositories”)
public class ApplicationConfig {
@Bean
public PrmPort prmPort() {
return new PrmAdapter();
}
@Bean
public PrmRepository prmRepositoryImpl(){
return new fr.enedis.icam.microapp.sample.infrastructure.adapters.PrmAdapter();
}
}
Kevin rdnv is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.