我最近部署了一个计划每天运行的 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) 我正在尝试构建一个 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) 作为标题,我的自定义属性:
#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 ....
我有一个基本的 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) 我已经使用 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)
我想验证parameterDateUnadjusted并parameterDateAdjusted确保它们都是有效日期。我已经尝试过,@DateTimeFormat(pattern = "yyyy-MM-dd")但只要它们坚持使用yyyy-MM-dd …
我的 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) 我在 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 中使用公司定制的库,并想知道我是否能够在运行时创建这样的 bean 并将其添加到 Spring 应用程序上下文中。
@Bean(name = {"customConnectionFactory"})
public ConnFactory connector() {
return new SimpleConnFactory(configuration(), "prefix");
}
Run Code Online (Sandbox Code Playgroud)
所以当我被允许在启动应用程序时正常连接 bean 时,这工作得很好。现在需求发生了变化,我应该能够在运行时动态执行此操作。我做了一些研究,似乎可以将类添加到 spring 上下文运行时,但是运行返回新对象的方法如何?
我创建了一个 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) 我正在使用 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 的路径。
spring-boot ×10
java ×5
spring ×5
aspectj ×1
cassandra ×1
junit ×1
memory-leaks ×1
office365 ×1
outlook ×1
postman ×1
rest ×1
spring-mvc ×1
validation ×1