MethodValidationPostProcessor 打破@Transactional

MethodValidationPostProcessor breaks @Transactional

我有一个 Controller,它调用一个 Service,它有 @Transactional 注释。

但是当我声明一个 bean MethodValidationPostProcessor 时,没有创建事务(无法初始化代理 - 没有会话)。

@EnableWebMvc
@ComponentScan(basePackages = {"my"})
public class Application extends WebMvcConfigurerAdapter {
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        return new MethodValidationPostProcessor();
    }
}

控制器 bean:

@RestController
@RequestMapping(path = "/my", produces = APPLICATION_JSON_VALUE)
public class MyController {

    @Autowired
    private TransactionalService transactionalService;

    @RequestMapping(method = POST)
    public void post(@SafeHtml @RequestBody String hey) {
        transactionalService.doStuff(hey);
    }
}

服务 bean:

@Service
public class TransactionalService {

    @PersistenceContext
    private EntityManager entityManager;

    @Transactional
    public void doStuff(String hey) {
        Item h = entityManager.find(Item.class, hey);
        h.getParent(); // could not initialize proxy - no Session
    }

}

我想了解为什么当我声明 MethodValidationPostProcessor@Transactional 不起作用。谢谢!

注意:如果我在我的控制器上添加@Transactional,它就可以工作。但这不是我想做的。

感谢@Kakawait,我找到了解决方法:声明我的 bean MethodValidationPostProcessor。需要 static 以便@Transactional 仍然正常工作。

/**
 * This bean must be static, to be instantiated before the other MethodValidationPostProcessors.
 * Otherwise, some are not instantiated.
 */
@Bean
public static MethodValidationPostProcessor methodValidationPostProcessor() {
    return new MethodValidationPostProcessor();
}