This won't work (aspect weaving) - SlugGenerator.slugger remains null. Please can someone have a look a this and give me a helping hand?
- My idea is to weave spring's service into the entity's value generator. I'm aware I can use entity's load event to inject that dependency.
- I have double checked whether Slugify component is instantiated properly by Spring (I can successfully inject it into controller).
Category.java (entity - domain object):
@Entity(name = "Category")
@Table(name = "category")
@Data
public class Category
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@GeneratorType(type = SlugGenerator.class, when = GenerationTime.ALWAYS)
private String slug;
// ...
}
SlugGenerator.java (value generator - instantiated by Hibernate):
@NoArgsConstructor
@Configurable(autowire = Autowire.BY_TYPE)
public class SlugGenerator implements ValueGenerator<String>
{
@Autowired
private Slugify slugger;
@Override
public String generateValue(Session session, Object owner) {
Category category = (Category) owner;
return slugger.slugify(category.getTitle());
}
}
Slugify.java (Spring-managed service):
@Component
public class SlugifyImpl implements Slugify {
@Override
public String slugify(String input)
{
// ...
}
}
DispatcherConf.java (Spring conf.):
public class DispatcherConf extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] {ApplicationConf.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {WebConf.class};
}
@Override
protected String[] getServletMappings() {
return new String[] {"/*"};
}
}
ApplicationConf.java (Spring conf.):
@Configuration
@EnableSpringConfigured
@Import({DataConf.class})
@ComponentScan(basePackages = {
"pl.xxx.api.utils",
})
public class ApplicationConf
{
@Bean
public RepositoryRestConfigurer repositoryRestConfigurer() {
return new RepositoryRestConfigurerAdapter() {
@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
config.setBasePath("/api");
}
};
}
}
WebConf.java (Spring conf.):
@Import(RepositoryRestMvcConfiguration.class)
public class WebConf {
}
build.gradle:
// ...
compile "org.springframework:spring-aspects:$springAspects"
// ...
jvm classpath (among others):
aspectjrt-1.8.13.jar
IntelliJ:
Build,Execution,Deployment > Compiler > Annotation Processors > Enable Annotation Processing set to TRUE