标签: spring-boot

Spring Boot 应用程序内存泄漏缓慢

我最近部署了一个计划每天运行的 Spring Boot 应用程序,以便解析来自 Cassandra 集群的新数据。经过大约 20 小时的工作(对 Cassandra 进行了数百万次读/写访问),出现了一些内存问题,并且在每次迭代时(异常被捕获在循环中)我都遇到了这个错误:

java.lang.RuntimeException: java.lang.IllegalStateException: java.lang.reflect.InvocationTargetException
    at org.springframework.data.mapping.model.ClassGeneratingPropertyAccessorFactory.createAccessorClass(ClassGeneratingPropertyAccessorFactory.java:170)
    at org.springframework.data.mapping.model.ClassGeneratingPropertyAccessorFactory.potentiallyCreateAndRegisterPersistentPropertyAccessorClass(ClassGeneratingPropertyAccessorFactory.java:154)
    at org.springframework.data.mapping.model.ClassGeneratingPropertyAccessorFactory.getPropertyAccessor(ClassGeneratingPropertyAccessorFactory.java:80)
    at org.springframework.data.mapping.model.BasicPersistentEntity.getPropertyAccessor(BasicPersistentEntity.java:425)
    at org.springframework.data.cassandra.convert.MappingCassandraConverter.getConvertingAccessor(MappingCassandraConverter.java:611)
    at org.springframework.data.cassandra.convert.MappingCassandraConverter.readEntityFromRow(MappingCassandraConverter.java:172)
    at org.springframework.data.cassandra.convert.MappingCassandraConverter.readRow(MappingCassandraConverter.java:149)
    at com.myapp.utils.CassandraIterable$1.next(CassandraIterable.java:35)
    at com.myapp.service.packer.PositionParsingService.parse(PositionParsingService.java:60)
    at com.myapp.service.packer.PositionLoadService.update(PositionLoadService.java:202)
    at com.myapp.service.packer.PositionLoadService.updateVehicle(PositionLoadService.java:129)
    at com.myapp.service.packer.PositionLoadService.updateAllVehicles(PositionLoadService.java:99)
    at com.myapp.service.packer.PositionLoadService.updateAllVehicles(PositionLoadService.java:84)
    at com.myapp.service.packer.PositionLoadService$$FastClassBySpringCGLIB$$2605bc6c.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:721)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.aop.interceptor.AsyncExecutionInterceptor$1.call(AsyncExecutionInterceptor.java:115)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalStateException: java.lang.reflect.InvocationTargetException
    at org.springframework.data.mapping.model.ClassGeneratingPropertyAccessorFactory$Evil.defineClass(ClassGeneratingPropertyAccessorFactory.java:1480)
    at org.springframework.data.mapping.model.ClassGeneratingPropertyAccessorFactory$PropertyAccessorClassGenerator.generateCustomAccessorClass(ClassGeneratingPropertyAccessorFactory.java:282)
    at org.springframework.data.mapping.model.ClassGeneratingPropertyAccessorFactory.createAccessorClass(ClassGeneratingPropertyAccessorFactory.java:168)
    ... 21 common frames omitted
Caused by: java.lang.reflect.InvocationTargetException: null
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at …
Run Code Online (Sandbox Code Playgroud)

memory-leaks cassandra spring-boot

4
推荐指数
1
解决办法
5452
查看次数

Google App Engine、Spring Boot 应用程序不断重启

我正在尝试构建一个 Spring Boot REST API 并将其托管在 Google 的 App Engine 上。我在工作中的项目中更喜欢 gradle,所以我选择使用 Gradle。文档很难浏览。

我终于得到了正确的 gradle 文件和正确的 app.yaml 配置。但是我的 Spring Boot 应用程序只是在 App Engine 上不断重启。无论任何外部影响如何,它都会自动重新启动(点击端点时没有错误;该应用程序就像在本地一样工作......持续几秒钟)。

我很难调试它。

这是再次重新启动之前的最后几条日志。看起来 SpringFrameworkServlet 导致了问题并使其重新启动?因为我的代码中没有任何 Servlet,但我很确定 App Engine 已经将 Servlet 融入到它的 Java docker 容器中。

A  2017-04-25 14:01:26.604  INFO 1 --- [           main] o.s.d.r.w.BasePathAwareHandlerMapping    : Mapped "{[/profile/{repository}],methods=[GET],produces=[application/schema+json]}" onto public org.springframework.http.HttpEntity<org.springframework.data.rest.webmvc.json.JsonSchema> org.springframework.data.rest.webmvc.RepositorySchemaController.schema(org.springframework.data.rest.webmvc.RootResourceInformation)

A  2017-04-25 14:01:27.362  INFO 1 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup

A  2017-04-25 14:01:28.937  INFO 1 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : …
Run Code Online (Sandbox Code Playgroud)

google-app-engine spring-boot

4
推荐指数
1
解决办法
1465
查看次数

Spring Boot中如何获取文件属性的内容

作为标题,我的自定义属性:

#app settings
my.chassisNum=10
Run Code Online (Sandbox Code Playgroud)

代码:

@PropertySource("classpath:appconf.properties")
@ConfigurationProperties(prefix = "my" )
@Component
public class AppConfig {

    private String chassisNum;

    public String getChassisNum() {
        return this.chassisNum;
    }

    public void setChassisNum(String chassisNum) {
        this.chassisNum = chassisNum;
    }
}
Run Code Online (Sandbox Code Playgroud)

当 Spring Boot 启动完成时,我得到的“chassisNum”值为 10。当我在 spring-boot 未启动完成时在其他地方得到它时,它得到“null”

@Component
public class CreateBaseFolder {

    private final Logger logger = LogManager.getLogger(CreateBaseFolder.class);
    private File f; 
    @Autowired
    AppConfig appconf;

    public CreateBaseFolder() {

        System.out.println(appconf.getChassisNum());


    } 
Run Code Online (Sandbox Code Playgroud)

我尝试了很多方法来获取它的价值,但都是错误的。例如:实现 InitializingBean、@DependsOn ....

spring-boot

4
推荐指数
1
解决办法
1万
查看次数

Spring Boot 中的 Junit Test 不注入服务

我有一个基本的 SpringBoot 应用程序。使用 Spring Initializer、嵌入式 Tomcat、Thymeleaf 模板引擎,并打包为可执行 JAR 文件。

我有这个服务:

@Service
public class TdkRestApiService {
    ...
}
Run Code Online (Sandbox Code Playgroud)

我想测试:

@ContextConfiguration(classes={TdkApplicationConfig.class, TdkDevelopmentConfig.class}) 
@RunWith(SpringRunner.class)
public class TdkRestApiServiceTests {


    /**
     * The object being tested.
     */
    @Autowired
    TdkRestApiService tdkRestApiService;

    @Test
    public void getCallbacksByDeviceTypeTest () throws IOException {

        tdkRestApiService.getCallbacksByDeviceType("2", "3");

    }
}
Run Code Online (Sandbox Code Playgroud)

但我有一个错误:

ERROR o.s.test.context.TestContextManager - Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@dd3b207] to prepare test instance [com.tdk.backend.service.TdkRestApiServiceTests@6db9f5a4]
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.tdk.backend.service.TdkRestApiServiceTests': Unsatisfied dependency expressed through field 'tdkRestApiService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No …
Run Code Online (Sandbox Code Playgroud)

java junit spring spring-mvc spring-boot

4
推荐指数
2
解决办法
9392
查看次数

使用 Spring Boot 或 Hibernate Validator 验证日期

我已经使用 Spring Boot 构建了一个 REST 服务。我也在使用 Hibernate Validator 来验证数据。我有一个像这样的 REST 端点:

@PostMapping(value = "${apiVersion.v_1}" + "/parameter-dates")
    public ResponseEntity createParameterDate( @RequestBody ParameterDate parameterDate){
// Some code that use parameterDate
}
Run Code Online (Sandbox Code Playgroud)

ParameterDate 在这样的类中定义:

public class ParameterDate {

    @NotNull(message = "Parameter Date Unadjusted can not be blank or null")
    private Date parameterDateUnadjusted;
    @NotNull(message = "Parameter Date Adjusted can not be blank or null")
    private Date parameterDateAdjusted;
    private Date parameterDateAdded;
    private Date parameterDateChanged;    
}
Run Code Online (Sandbox Code Playgroud)

我想验证parameterDateUnadjustedparameterDateAdjusted确保它们都是有效日期。我已经尝试过,@DateTimeFormat(pattern = "yyyy-MM-dd")但只要它们坚持使用yyyy-MM-dd …

java validation spring hibernate-validator spring-boot

4
推荐指数
1
解决办法
6943
查看次数

如何使用spring boot通过outlook发送邮件?

我的 application.properties 文件包含以下配置:-

spring.mail.properties.mail.smtp.connecttimeout=5000
  spring.mail.properties.mail.smtp.timeout=3000
  spring.mail.properties.mail.smtp.writetimeout=5000
  spring.mail.host=smtp.office365.com
  spring.mail.password=password
  spring.mail.port=587
  spring.mail.username=test@outlook.com
  spring.mail.properties.mail.smtp.starttls.enable=true
  security.require-ssl=true
  spring.mail.properties.mail.smpt.auth=true
Run Code Online (Sandbox Code Playgroud)

用于实现邮件服务器的 Java 类是:

@Component
public class SmtpMailSender {
@Autowired
private JavaMailSender javaMailSender;

public void sendMail(String to, String subject, String body) throws MessagingException {
    MimeMessage message = javaMailSender.createMimeMessage();
    MimeMessageHelper helper;
    helper = new MimeMessageHelper(message, true);//true indicates multipart message
    helper.setSubject(subject);
    helper.setTo(to);
    helper.setText(body, true);//true indicates body is html
    javaMailSender.send(message);
}
}
Run Code Online (Sandbox Code Playgroud)

我的控制器类是:

@RestController
public class MailController {

@Autowired
SmtpMailSender smtpMailSender;

@RequestMapping(path = "/api/mail/send")
public void sendMail() throws MessagingException {
    smtpMailSender.sendMail("test123@outlook.com", …
Run Code Online (Sandbox Code Playgroud)

java outlook spring office365 spring-boot

4
推荐指数
1
解决办法
2万
查看次数

每个请求的 Spring Boot Basic Auth,为以后的请求验证用户名

我在 Spring Boot 中启用了 http 基本身份验证。从 Postman 打电话时,我看到奇怪的结果

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

  @Autowired
  private ApiUserDetailsService userDetails;

  @Bean
  public ShaPasswordEncoder passwordEncoder() {
    return new ShaPasswordEncoder();
  }

  @Autowired
  public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    ReflectionSaltSource salt = new ReflectionSaltSource();
    salt.setUserPropertyToUse("username");
    DaoAuthenticationProvider dao = new DaoAuthenticationProvider();
    dao.setUserDetailsService(userDetails);
    dao.setPasswordEncoder(passwordEncoder());
    dao.setSaltSource(salt);
    auth.authenticationProvider(dao);
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().anyRequest().authenticated().and().csrf().disable().httpBasic();
  }
Run Code Online (Sandbox Code Playgroud)

客户详细信息

@Service
public class ApiUserDetailsService implements UserDetailsService {

  @Autowired
  private JdbcTemplate jdbcTemplate;

  @Value("${spring.queries.users.query}")
  private String usersQuery;

  @Override …
Run Code Online (Sandbox Code Playgroud)

spring-boot postman

4
推荐指数
1
解决办法
1364
查看次数

使用方法在运行时动态创建 Spring bean

我必须在 Spring Boot 中使用公司定制的库,并想知道我是否能够在运行时创建这样的 bean 并将其添加到 Spring 应用程序上下文中。

@Bean(name = {"customConnectionFactory"})   
public ConnFactory connector() {
    return new SimpleConnFactory(configuration(), "prefix");
}
Run Code Online (Sandbox Code Playgroud)

所以当我被允许在启动应用程序时正常连接 bean 时,这工作得很好。现在需求发生了变化,我应该能够在运行时动态执行此操作。我做了一些研究,似乎可以将类添加到 spring 上下文运行时,但是运行返回新对象的方法如何?

spring spring-boot

4
推荐指数
1
解决办法
4117
查看次数

我希望我的 Spring Boot 应用程序连接到 JNDI 数据源(服务器:wildfly)

我创建了一个 spring boot 应用程序,它从 application.properties 文件中读取数据库和服务器配置,但是当我部署到 wildfly 时,我希望应用程序应该从 wildfly 的 standalone.xml 文件中读取数据库配置,但它仍然从 Application.properties 文件中读取。

//Spring Boot 主应用类

@EnableAutoConfiguration
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class })
public class DemoWildFlyApplication extends SpringBootServletInitializer
{
    public static void main(String[] args) {
        SpringApplication.run(DemoWildFlyApplication.class, args);
    }
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(DemoWildFlyApplication.class);
    }

    @Bean
    @Primary
    public DataSource primaryDataSource() {
        JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
        DataSource dataSource = dataSourceLookup.getDataSource("java:jboss/datasources/primary");
        return dataSource;
    }
Run Code Online (Sandbox Code Playgroud)

//application.properties 文件

spring.datasource.primary.jndi-name=java:jboss/datasources/primary
spring.datasource.primary.driver-class-name=org.postgresql.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect
spring.jpa.show-sql=false
spring.jpa.generate-ddl=true
Run Code Online (Sandbox Code Playgroud)

//独立的.xml

  <xa-datasource jndi-name="java:jboss/datasources/primary" pool-name="pool" enabled="true" use-java-context="true"> …
Run Code Online (Sandbox Code Playgroud)

java spring spring-boot

4
推荐指数
1
解决办法
8741
查看次数

使用 Spring AspectJ 记录 REST 资源 URL

我正在使用 Spring Boot 开发 REST API,我想记录客户端使用 Spring Aspect 检索的资源的 URL。我的 Aspect 类有以下代码:

@Component
@Aspect
public class Logs {

    @Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)")
    public void allResources() {}

    @Before("allResources()")
    public void apiRequestLog(JoinPoint jp) {    
        LogManager.getLogger(jp.getSignature().getDeclaringTypeName()).info("------------------------- o -------------------------");
        String log = jp.getSignature().getName() + " >>>";
        for (Object arg : jp.getArgs()) {
            log += "\n   ARG: " + arg;
        }
        LogManager.getLogger(jp.getSignature().getDeclaringTypeName()).info(log);

    }
}
Run Code Online (Sandbox Code Playgroud)

我不知道如何将 RequestMapping 对象作为参数传递给建议,并获取 URL 的路径。

java rest aspectj spring-boot

4
推荐指数
2
解决办法
3271
查看次数