0

Apache camel は、特定の URL をリッスンしているルートを使用しています。次に、この URL の json が pojo クラスに変換され、mySQL データベースに挿入されます。私の外部キーがまだnullのままであることを除いて、すべてが正常に機能しています。私は春のフレームワークを使用しています。

データを見つけることができる URL は次のとおりです: https://builds.apache.org:443/job/Accumulo-1.5/api/json

これがラクダのルート定義です

@Component
public class JenkinsConfigurationRouteBuilder extends SpringRouteBuilder {

private Logger logger = LoggerFactory.getLogger(JenkinsConfigurationRouteBuilder.class);

@Override
public void configure() throws Exception {

    logger.info("Configuring route");

    //Properties die hij niet vindt in de klasse negeren
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    DataFormat jenkinsConfigFormat = new JacksonDataFormat(objectMapper, JenkinsConfiguration.class);

    from("timer://foo?fixedRate=true&delay=0&period=200000&repeatCount=1")
            .routeId("jsonToJenkinsConfiguration")
            .setHeader(Exchange.HTTP_METHOD, constant("GET"))
            .to("https://builds.apache.org:443/job/Accumulo-1.5/api/json")
            .convertBodyTo(String.class)
            .unmarshal(jenkinsConfigFormat) //instance van JenkinsConfiguration
            .log(LoggingLevel.DEBUG, "be.kdg.teamf", "Project: ${body}")
            .to("hibernate:be.kdg.teamf.model.JenkinsConfiguration");    


    }


}

私の POJO クラス

@Entity(name = "jenkinsConfiguration")
public class JenkinsConfiguration extends Configuration implements Serializable {

@Column
@JsonProperty("displayName")
private String name;

@JsonProperty("healthReport")
@JsonIgnore
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = ("jenkinsConfig"))
private Collection<HealthReport> healthReport;

@JsonProperty("builds")
@JsonIgnore
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = ("jenkinsConfig"))
private Collection<Build> builds;

@JsonProperty("modules")
@JsonIgnore
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = ("jenkinsConfig"))
private Collection<Module> modules;


public JenkinsConfiguration() {
}

public JenkinsConfiguration(Collection<Build> builds, Collection<HealthReport> healthReport, Collection<Module> modules, String name) {
    this.builds = builds;
    this.healthReport = healthReport;
    this.modules = modules;
    this.name = name;
}

public Collection<Build> getBuilds() {
    return builds;
}

public Collection<HealthReport> getHealthReport() {
    return healthReport;
}

public Collection<Module> getModules() {
    return modules;
}

public String getName() {
    return name;
}

public void setBuilds(Collection<Build> builds) {
    this.builds = builds;
}

public void setHealthReport(Collection<HealthReport> healthReport) {
    this.healthReport = healthReport;
}

public void setModules(Collection<Module> modules) {
    this.modules = modules;
}

public void setName(String name) {
    this.name = name;
}

@Override
public String toString() {
    return ToStringBuilder.reflectionToString(this);
}

}

ビルドを例にとってみましょう。ご覧のとおり、この pojo クラスにはビルドのリストが含まれています。JenkinsConfiguration には、さらに多くのビルドを含めることができます。1 つのビルドは 1 つの JenkinsConfiguration に属します。

これは私のビルドクラスです:

@XmlRootElement(name = "builds")
@Entity(name = "build")
public class Build implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int Id;

@Column
@JsonProperty("number")
private Integer number;

@Column
@JsonProperty("url")
private String url;

@JsonBackReference
@OnDelete(action = OnDeleteAction.CASCADE)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "jenkinsConfig")
private JenkinsConfiguration jenkinsConfig;

public Build() {

}

public Build(JenkinsConfiguration jenkinsConfig, Integer number, String url) {
    this.jenkinsConfig = jenkinsConfig;
    this.number = number;
    this.url = url;
}

public int getId() {
    return Id;
}

public JenkinsConfiguration getJenkinsConfig() {
    return jenkinsConfig;
}

public Integer getNumber() {
    return number;
}

public String getUrl() {
    return url;
}

public void setId(int id) {
    Id = id;
}

public void setJenkinsConfig(JenkinsConfiguration jenkinsConfig) {
    this.jenkinsConfig = jenkinsConfig;
}

public void setNumber(Integer number) {
    this.number = number;
}

public void setUrl(String url) {
    this.url = url;
}
}

私の質問: ビルド クラスに外部キーが設定されていないのはなぜですか? null のままです。手動で更新する必要がありますか?もしそうなら、どうすれば春にそれを行うことができますか?

どんな助けでも大歓迎です!

4

1 に答える 1

1

データベースのレコードを次のように更新して修正しました。

キャメル:

from("hibernate:be.kdg.teamf.model.Build?delay=1s")
            .routeId("buildFkBuild")
            .startupOrder(3)
            .shutdownRunningTask(ShutdownRunningTask.CompleteAllTasks)
            .to("bean:buildFK?method=processBuild")
            .log(LoggingLevel.DEBUG, "be.kdg.teamf", "Project: ${body}")
            .to("hibernate:be.kdg.teamf.model.Build");

豆:

 @Consumed
 public Build processBuild(Build build) {
    //updaten van foreign key
    build.setJenkinsConfig(jenkinsConfiguration);
    return build;
 }
于 2013-05-14T12:42:24.023 に答える