Я сталкиваюсь с проблемой, когда использую аннотацию @Transactional в классе, который расширен классом Service.Я знаю, что Spring выполняет Transaction Management только тогда, когда метод вызывается прокси, но моя проблема заключается в том, что из-за этой аннотации я не могу получить значение свойства другого класса Service при непосредственном доступе к объекту (свойство public), но я тожевозможность получения с помощью метода получения.
Контроллер
package com.springbootdemo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@Autowired
Service1 service1;
@GetMapping("/")
public void index() {
service1.doSomething();
}
}
Service1
package com.springbootdemo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Service1 {
@Autowired
Service2 service2;
public void doSomething(){
service2.setSname("Hello");
System.out.println("sname==> "+service2.sname);
System.out.println("getSname==>"+service2.getSname());
}
}
UtilBean
package com.springbootdemo;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Component
public class UtilBean {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public String appendString(String s1) {
return " Hi "+ s1;
}
}
Сервис2
package com.springbootdemo;
import org.springframework.stereotype.Component;
@Component
public class Service2 extends UtilBean{
public String sname;
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
}
application.properties
management.endpoints.web.exposure.include=*
#management.endpoints.web.exposure.exclude=loggers
#security.user.name=admin
#security.user.password=admin
spring.datasource.url=jdbc:mysql://192.168.0.10:3306/aswaraj?zeroDateTimeBehavior=convertToNull&useSSL=false
spring.datasource.username=root
spring.datasource.password=test
spring.datasource.platform=mysql
spring.session.store-type=none
security.basic.enabled=false
Выход
sname==> null
getSname==>Hello