1

json 文字列を pojo クラスにアンマーシャリングしたいと思います。既存の URL から読み取っています: https://builds.apache.org/job/Accumulo-1.5/api/json

URLを非整列化するためにapache camelを使用しています

@Component
public class RouteBuilder extends SpringRouteBuilder {

private Logger logger = LoggerFactory.getLogger(RouteBuilder.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 reportFormat = new JacksonDataFormat(objectMapper, HealthReport.class);

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


}

}

ここまでは順調ですね。hibernate アノテーションを使用して「healthReport」ノードのみを挿入したいと思います。

@XmlRootElement(name = "healthReport")
@JsonRootName(value = "healthReport")
@Entity(name = "healthreport")
public class HealthReport implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int Id;

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

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

@Column
@JsonProperty("score")
private int score;

public HealthReport() {
}

public HealthReport(int score, String iconUrl, String description) {
    this.score = score;
    this.iconUrl = iconUrl;
    this.description = description;
}

public String getDescription() {
    return description;
}

public String getIconUrl() {
    return iconUrl;
}

public int getId() {
    return Id;
}

public int getScore() {
    return score;
}

public void setDescription(String description) {
    this.description = description;
}

public void setIconUrl(String iconUrl) {
    this.iconUrl = iconUrl;
}

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

public void setScore(int score) {
    this.score = score;
}
}

ここが問題です。注釈が認識されず、null 値のみがデータベースに挿入されます

@XmlRootElement(name = "healthReport")
@JsonRootName(value = "healthReport")

これを修正する方法を知っている人はいますか?

ありがとう

4

2 に答える 2

2

ルートにプロセッサを使用して修正しました

public class HealthReportProcessor implements Processor {
@Autowired
private ConfigurationService configurationService;

@Override
public void process(Exchange exchange) throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    JsonNode root = mapper.readTree(exchange.getIn().getBody().toString());
    ArrayNode report = (ArrayNode) root.get("healthReport");

    int configId = configurationService.findJenkinsConfigurationByName(root.get("displayName").asText()).getId();

    for (JsonNode node : report) {
        JsonObject obj = new JsonObject();
        obj.addProperty("description", node.get("description").asText());
        obj.addProperty("iconUrl", node.get("iconUrl").asText());
        obj.addProperty("score", node.get("score").asInt());
        obj.addProperty("jenkinsConfig", configId);

        exchange.getIn().setBody(obj.toString());
    }
}
}

それは機能していますが、より良い解決策があると思います。より良い解決策があれば教えてください;)

于 2013-05-10T13:02:03.720 に答える
0

これを試してみませんか?

 from("timer://foo?fixedRate=true&delay=0&period=2000&repeatCount=1")
.routeId("accumoloToJsonRoute")
.setHeader(Exchange.HTTP_METHOD,constant("GET"))
.to("https://builds.apache.org:443/job/Accumulo-1.5/apijson")
.unmarshal().json(JsonLibrary.Jackson, HealthReport.class)

そして、応答パラメーターが POJO フィールドと一致していることを確認してください。

それが機能するかどうか教えてください。

于 2013-05-10T20:14:12.417 に答える