[英]Liquibase migration exception in Jhipster
我有一個帶有兩個微服務和一個網關的JHipster項目。 兩者都是通過JHipster生成的。 我正在嘗試從Spring Cloud Stream with Kafka
Streams的Projects
Microservice中將對象發送到ChargeCodes微服務。 為此,我在ProjectResource.java文件中添加了Spring Cloud Stream代碼 。 根據我的要求,每當創建新項目對象時,Spring Cloud Stream都應將其發送給Kafka主題,第二個微服務中的Kafka使用者將使用它。 為簡單起見,我在同一項目中創建了生產者和消費者。 當我編譯微服務時,出現以下異常。
liquibase.exception.MigrationFailedException: Migration failed for change set config/liquibase/changelog/20180205173557_added_entity_Address.xml::20180205173557-1::jhipster:
我的帶有Spring Cloud Stream和Kafka的標准Spring Boot Rest API應用程序運行正常,沒有任何問題。 我不確定JHipster代碼有什么問題。 代碼上傳到github倉庫中 。
項目資源
package com.projects.web.rest;
import com.codahale.metrics.annotation.Timed;
import com.projects.domain.Project;
import com.projects.messaging.Greeting;
import com.projects.repository.ProjectRepository;
import com.projects.web.rest.errors.BadRequestAlertException;
import com.projects.web.rest.util.HeaderUtil;
import com.projects.web.rest.util.PaginationUtil;
import io.github.jhipster.web.util.ResponseUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import java.util.Optional;
/**
* REST controller for managing Project.
*/
@RestController
@RequestMapping("/api")
@EnableBinding(Source.class)
public class ProjectResource
{
private final Logger log = LoggerFactory.getLogger(ProjectResource.class);
private static final String ENTITY_NAME = "project";
private final ProjectRepository projectRepository;
@Autowired
private Source source;
public ProjectResource(ProjectRepository projectRepository)
{
this.projectRepository = projectRepository;
}
/**
* POST /projects : Create a new project.
*
* @param project
* the project to create
* @return the ResponseEntity with status 201 (Created) and with body the new
* project, or with status 400 (Bad Request) if the project has already
* an ID
* @throws URISyntaxException
* if the Location URI syntax is incorrect
*/
@PostMapping("/projects")
@Timed
public ResponseEntity<Project> createProject(@Valid @RequestBody Project project) throws URISyntaxException
{
log.debug("REST request to save Project : {}", project);
if (project.getId() != null)
{
throw new BadRequestAlertException("A new project cannot already have an ID", ENTITY_NAME, "idexists");
}
Project result = projectRepository.save(project);
source.output().send(MessageBuilder.withPayload(result).build());
return ResponseEntity.created(new URI("/api/projects/" + result.getId()))
.headers(HeaderUtil.createEntityCreationAlert(ENTITY_NAME, result.getId().toString())).body(result);
}
/**
* PUT /projects : Updates an existing project.
*
* @param project
* the project to update
* @return the ResponseEntity with status 200 (OK) and with body the updated
* project, or with status 400 (Bad Request) if the project is not
* valid, or with status 500 (Internal Server Error) if the project
* couldn't be updated
* @throws URISyntaxException
* if the Location URI syntax is incorrect
*/
@PutMapping("/projects")
@Timed
public ResponseEntity<Project> updateProject(@Valid @RequestBody Project project) throws URISyntaxException
{
log.debug("REST request to update Project : {}", project);
if (project.getId() == null)
{
return createProject(project);
}
Project result = projectRepository.save(project);
source.output().send(MessageBuilder.withPayload(result).build());
return ResponseEntity.ok().headers(HeaderUtil.createEntityUpdateAlert(ENTITY_NAME, project.getId().toString()))
.body(result);
}
/**
* GET /projects : get all the projects.
*
* @param pageable
* the pagination information
* @return the ResponseEntity with status 200 (OK) and the list of projects in
* body
*/
@GetMapping("/projects")
@Timed
public ResponseEntity<List<Project>> getAllProjects(Pageable pageable)
{
log.debug("REST request to get a page of Projects");
Page<Project> page = projectRepository.findAll(pageable);
HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/api/projects");
return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK);
}
/**
* GET /projects/:id : get the "id" project.
*
* @param id
* the id of the project to retrieve
* @return the ResponseEntity with status 200 (OK) and with body the project, or
* with status 404 (Not Found)
*/
@GetMapping("/projects/{id}")
@Timed
public ResponseEntity<Project> getProject(@PathVariable Long id)
{
log.debug("REST request to get Project : {}", id);
Project project = projectRepository.findOne(id);
return ResponseUtil.wrapOrNotFound(Optional.ofNullable(project));
}
/**
* DELETE /projects/:id : delete the "id" project.
*
* @param id
* the id of the project to delete
* @return the ResponseEntity with status 200 (OK)
*/
@DeleteMapping("/projects/{id}")
@Timed
public ResponseEntity<Void> deleteProject(@PathVariable Long id)
{
log.debug("REST request to delete Project : {}", id);
projectRepository.delete(id);
return ResponseEntity.ok().headers(HeaderUtil.createEntityDeletionAlert(ENTITY_NAME, id.toString())).build();
}
}
例外:
projects-app_1 | 2018-02-06 18:56:24.704 ERROR 6 --- [ main] liquibase : classpath:config/liquibase/master.xml: config/liquibase/changelog/20180205173557_added_entity_Address.xml::20180205173557-1::jhipster: Change Set config/liquibase/changelog/20180205173557_added_entity_Address.xml::20180205173557-1::jhipster failed. Error: Table 'address' already exists [Failed SQL: CREATE TABLE projects.address (id BIGINT AUTO_INCREMENT NOT NULL, street_name VARCHAR(255) NOT NULL, apartment_or_house_number VARCHAR(255) NULL, city VARCHAR(255) NOT NULL, zipcode BIGINT NOT NULL, state VARCHAR(255) NULL, country VARCHAR(255) NULL, CONSTRAINT PK_ADDRESS PRIMARY KEY (id))]
projects-app_1 | 2018-02-06 18:56:24.829 WARN 6 --- [ main] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [com/projects/config/DatabaseConfiguration.class]: Invocation of init method failed; nested exception is liquibase.exception.MigrationFailedException: Migration failed for change set config/liquibase/changelog/20180205173557_added_entity_Address.xml::20180205173557-1::jhipster:
projects-app_1 | Reason: liquibase.exception.DatabaseException: Table 'address' already exists [Failed SQL: CREATE TABLE projects.address (id BIGINT AUTO_INCREMENT NOT NULL, street_name VARCHAR(255) NOT NULL, apartment_or_house_number VARCHAR(255) NULL, city VARCHAR(255) NOT NULL, zipcode BIGINT NOT NULL, state VARCHAR(255) NULL, country VARCHAR(255) NULL, CONSTRAINT PK_ADDRESS PRIMARY KEY (id))]
projects-app_1 | 2018-02-06 18:56:25.380 ERROR 6 --- [ main] o.s.boot.SpringApplication : Application startup failed
projects-app_1 |
projects-app_1 | org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [com/projects/config/DatabaseConfiguration.class]: Invocation of init method failed; nested exception is liquibase.exception.MigrationFailedException: Migration failed for change set config/liquibase/changelog/20180205173557_added_entity_Address.xml::20180205173557-1::jhipster:
projects-app_1 | Reason: liquibase.exception.DatabaseException: Table 'address' already exists [Failed SQL: CREATE TABLE projects.address (id BIGINT AUTO_INCREMENT NOT NULL, street_name VARCHAR(255) NOT NULL, apartment_or_house_number VARCHAR(255) NULL, city VARCHAR(255) NOT NULL, zipcode BIGINT NOT NULL, state VARCHAR(255) NULL, country VARCHAR(255) NULL, CONSTRAINT PK_ADDRESS PRIMARY KEY (id))]
projects-app_1 | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)
projects-app_1 | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
projects-app_1 | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
projects-app_1 | at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
projects-app_1 | at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
projects-app_1 | at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
projects-app_1 | at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
projects-app_1 | at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:296)
projects-app_1 | at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
projects-app_1 | at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1080)
projects-app_1 | at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:857)
projects-app_1 | at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
projects-app_1 | at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
projects-app_1 | at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
projects-app_1 | at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
projects-app_1 | at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
projects-app_1 | at com.projects.ProjectsApp.main(ProjectsApp.java:68)
projects-app_1 | at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
projects-app_1 | at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
projects-app_1 | at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
projects-app_1 | at java.lang.reflect.Method.invoke(Method.java:498)
projects-app_1 | at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
projects-app_1 | at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
projects-app_1 | at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
projects-app_1 | at org.springframework.boot.loader.WarLauncher.main(WarLauncher.java:59)
projects-app_1 | Caused by: liquibase.exception.MigrationFailedException: Migration failed for change set config/liquibase/changelog/20180205173557_added_entity_Address.xml::20180205173557-1::jhipster:
projects-app_1 | Reason: liquibase.exception.DatabaseException: Table 'address' already exists [Failed SQL: CREATE TABLE projects.address (id BIGINT AUTO_INCREMENT NOT NULL, street_name VARCHAR(255) NOT NULL, apartment_or_house_number VARCHAR(255) NULL, city VARCHAR(255) NOT NULL, zipcode BIGINT NOT NULL, state VARCHAR(255) NULL, country VARCHAR(255) NULL, CONSTRAINT PK_ADDRESS PRIMARY KEY (id))]
projects-app_1 | at liquibase.changelog.ChangeSet.execute(ChangeSet.java:619)
projects-app_1 | at liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.java:51)
projects-app_1 | at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:79)
projects-app_1 | at liquibase.Liquibase.update(Liquibase.java:214)
projects-app_1 | at liquibase.Liquibase.update(Liquibase.java:192)
projects-app_1 | at liquibase.integration.spring.SpringLiquibase.performUpdate(SpringLiquibase.java:431)
projects-app_1 | at liquibase.integration.spring.SpringLiquibase.afterPropertiesSet(SpringLiquibase.java:388)
projects-app_1 | at io.github.jhipster.config.liquibase.AsyncSpringLiquibase.initDb(AsyncSpringLiquibase.java:94)
projects-app_1 | at io.github.jhipster.config.liquibase.AsyncSpringLiquibase.afterPropertiesSet(AsyncSpringLiquibase.java:84)
projects-app_1 | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
projects-app_1 | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
projects-app_1 | ... 24 common frames omitted
projects-app_1 | Caused by: liquibase.exception.DatabaseException: Table 'address' already exists [Failed SQL: CREATE TABLE projects.address (id BIGINT AUTO_INCREMENT NOT NULL, street_name VARCHAR(255) NOT NULL, apartment_or_house_number VARCHAR(255) NULL, city VARCHAR(255) NOT NULL, zipcode BIGINT NOT NULL, state VARCHAR(255) NULL, country VARCHAR(255) NULL, CONSTRAINT PK_ADDRESS PRIMARY KEY (id))]
projects-app_1 | at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:309)
projects-app_1 | at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:55)
projects-app_1 | at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:113)
projects-app_1 | at liquibase.database.AbstractJdbcDatabase.execute(AbstractJdbcDatabase.java:1277)
projects-app_1 | at liquibase.database.AbstractJdbcDatabase.executeStatements(AbstractJdbcDatabase.java:1259)
projects-app_1 | at liquibase.changelog.ChangeSet.execute(ChangeSet.java:582)
projects-app_1 | ... 34 common frames omitted
projects-app_1 | Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'address' already exists
projects-app_1 | at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
projects-app_1 | at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
projects-app_1 | at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
projects-app_1 | at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
projects-app_1 | at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
projects-app_1 | at com.mysql.jdbc.Util.getInstance(Util.java:408)
projects-app_1 | at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943)
projects-app_1 | at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)
projects-app_1 | at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
projects-app_1 | at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
projects-app_1 | at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
projects-app_1 | at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2483)
projects-app_1 | at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2441)
projects-app_1 | at com.mysql.jdbc.StatementImpl.executeInternal(StatementImpl.java:845)
projects-app_1 | at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:745)
projects-app_1 | at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:95)
projects-app_1 | at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java)
projects-app_1 | at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:307)
projects-app_1 | ... 39 common frames omitted
projects-app_1 |
乍看之下,似乎是由於某種原因導致DATABASECHANGELOG中的一個或多個行被刪除,因此,用於創建表projects.address的變更集的Liquibase再次被運行,但是該表已經存在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.