Analysis of the reasons why MyBatis transactions do not roll back

<aop:config>
	<aop:pointcut id="mmethod" expression="execution(* com.jc.bus.jttsp.service.*.*(..))" />
	<aop:advisor advice-ref="txAdvice" pointcut-ref="mmethod" />
</aop:config>

  First check if there is a problem with the pointcut.

  If the @Service annotation is scanned by SpringMVC, there is no transaction attribute in the Service.

  

package com.jc.spring.main;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages={"com.jc.bus.*.web.**"})
public class WebConfig extends WebMvcConfigurerAdapter{
	
	@Bean
	public ViewResolver viewresolver(){
		
		InternalResourceViewResolver resolver = new InternalResourceViewResolver();
		
		resolver.setPrefix("/WEB-INF/view/");
		resolver.setSuffix(".jsp");
		resolver.setExposeContextBeansAsAttributes(true);
		
		return resolver;
	}
	
	@Bean
	public MultipartResolver multipartResolver() throws IOException{
		CommonsMultipartResolver cmr = new CommonsMultipartResolver();
		cmr.setUploadTempDir(new FileSystemResource("/tmp/file"));
		cmr.setMaxUploadSize(1048576);
		cmr.setMaxInMemorySize(0);
		return cmr;
	}
	
	@Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(mappingJacksonHttpMessageConverter());
        super.configureMessageConverters(converters);
    }
	
    @Bean
    public JacksonAnnotationIntrospector jacksonAnnotationIntrospector() {
        return new JacksonAnnotationIntrospector();
    }
    
    @Bean(name = "objectMapper")
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        mapper.configure(SerializationFeature.INDENT_OUTPUT, false);
        
        mapper.setAnnotationIntrospector(jacksonAnnotationIntrospector());
        mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

        return mapper;
    }
    
    @Bean
    public RequestMappingHandlerAdapter requestMappingHandlerAdapter(){
    	RequestMappingHandlerAdapter amga = new RequestMappingHandlerAdapter();
    	List<HttpMessageConverter<?>> ls = new ArrayList<HttpMessageConverter<?>>();
    	ls.add(mappingJacksonHttpMessageConverter());
    	amga.setMessageConverters (ls);
    	return amga;
    }
    
    @Bean
    public MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter() {
        MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
        messageConverter.setObjectMapper(objectMapper());
        return messageConverter;
    }
	
	@Override
	public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
		// TODO Auto-generated method stub
		configurer.enable();
	}

}

   If you find that the SpringMVC package does scan the service, you can handle it yourself and use Spring to scan the service.

package com.jc.spring.main;

import javax.annotation.Resource;
import javax.sql.DataSource;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ImportResource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

import com.jc.spring.extend.SpringContextHolder;

@Configuration
@ComponentScan(basePackages = { "com.jc.spring.extend.**","com.jc.bus.*.service.**" }, excludeFilters = { @Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class) })
@ImportResource(value = { "classpath:/com/jc/spring/main/spring-transaction.xml" })
public class RootConfig {

	@Resource(name = "dataSource")
	DataSource dataSource;
	
	@Bean(name = "jdbcTemplate")
	public JdbcTemplate jdbcTemplate() {
		return new JdbcTemplate(dataSource);
	}

}

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326216552&siteId=291194637