Spring @Transactional не работает - PullRequest
0 голосов
/ 07 декабря 2018

Я сталкиваюсь с проблемой, когда использую аннотацию @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
...