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();
}
我有一个 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();
}