2

ここに私のコントローラクラスがあります:

@Controller
@RequestMapping("/actuator")
public class HealthController {

    @RequestMapping(value = "/metrics", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON)
    @ResponseBody
    public HealthModel getDump() throws JsonProcessingException {
        return new HealthModel();
        //return mapper.writeValueAsString(metrics.invoke());
    }

    @RequestMapping(value = "/metrics", method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN)
    @ResponseBody
    public String getHealth() {
        return "HEALTHY";
    }
}

モデル

public class HealthModel {

    @JsonProperty
    private String status;
    @JsonProperty
    private int id;

    public HealthModel(){
        this.status="WARN";
        this.id=2;
    }

}

注:リクエストで/metricsreturnjsonまたはplain-textに応じてマッピングしましたAccept Header

でリクエストするとき

curl -v -H "Accept: application/json" http://localhost:8080/myapp/actuator/metrics

json で期待される応答が得られ {"status":"WARN","id":2}ます。

しかし、試してみると

curl -v -H "Accept: text/plain" http://localhost:8080/myapp/actuator/metrics

私は得るHTTP/1.1 406 Not Acceptable

編集

@EnableWebMvc
@Configuration
public class AppMvcConfig extends WebMvcConfigurerAdapter {

   @Resource(name = "appObjectMapper")
    private ObjectMapper appObjectMapper;

    @Resource(name = "modelObjectMapper")
    private ObjectMapper modelObjectMapper;

 @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

        final MappingJackson2HttpMessageConverter inputConverter = new MappingJackson2HttpMessageConverter();
        inputConverter.setObjectMapper(appObjectMapper);

        final MappingJackson2HttpMessageConverter outputConverter = new MappingJackson2HttpMessageConverter();
        outputConverter.setObjectMapper(modelObjectMapper);

        converters.add(new JacksonDualMapperConverter(appObjectMapper, modelObjectMapper));

        super.configureMessageConverters(converters);
    }

}
4

3 に答える 3

3

ドキュメントによると、@ResponseBodyは、戻り値の型を HTTP 応答本文に直接書き込む必要があることを示します (モデルに配置したり、ビュー名として解釈したりしないでください)。したがって、注釈が必要です。よく見ると、生成された注釈が正しくないようです。であってはなりproduces = MediaType.TEXT_PLAIN_VALUEませんproduces = MediaType.TEXT_PLAIN。私は次のことを試しましたが、うまくいきました:

    @RequestMapping(value = "/metrics", method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN_VALUE)
    @ResponseBody
    public String getHealth() {
        return "HEALTHY";
    }

StringHttpMessageConverterを追加する必要がある場合もあります。

于 2015-09-04T17:19:11.520 に答える
3

カスタム MessageConverter を追加しているためconfigureMessageConverters、これによりデフォルトのコンバーター登録がオフになります ( JavaDoc を参照)。

そのため、コンテンツ ネゴシエーションが始まると、JSON メディア タイプのみをサポートし、text/plain.

をサポートするには、 StringHttpMessageConverterをリストに追加する必要がありtext/plainます。

converters.add(new StringHttpMessageConverter());
于 2015-09-04T18:20:52.710 に答える