【发布时间】:2017-12-11 23:41:24
【问题描述】:
这不起作用(aspect weaving) - SlugGenerator.slugger 仍然是 null。请问有人可以看看这个并帮我一把吗?
- 我的想法是将spring的服务编织到实体的价值生成器中。我知道我可以使用实体的加载事件来注入该依赖项。
- 我已经仔细检查过 Spring 是否正确实例化了 Slugify 组件(我可以成功地将其注入控制器)。
Category.java(实体-域对象):
@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(值生成器 - 由 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 托管服务):
@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 类路径(等等):
aspectjrt-1.8.13.jar
智能:
Build,Execution,Deployment > Compiler > Annotation Processors > Enable Annotation Processing set to TRUE
【问题讨论】:
-
你遇到了什么错误?
-
从您的问题中看不到的是您使用的是编译时编织还是加载时编织。如果没有其中任何一个,它将无法正常工作。
-
@NándorElődFekete,我该怎么做? Spring 的 @EnableLoadTimeWeaving?
-
@BłażejKocik 用于加载时编织,请参阅我的 answer 以解决类似问题。简而言之,对于加载时编织,最好使用 aspectj weaver java 代理。 (可选)在
aop.xml中指定编织器选项-showWeaveInfo -verbose,详细信息here 用于调试目的。我不熟悉 gradle,所以我无法真正帮助您在 gradle 中设置编译时编织。在 maven 中,有一个名为 aspectj-maven-plugin 的插件 -
@NándorElődFekete,感谢您的宝贵时间和良好的回答! :)
标签: java spring hibernate aspectj spring-data-rest