Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to get different Content-Types in request mapping using Spring Framework

Here is my controller class:

@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";
    }
}

Model:

public class HealthModel {

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

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

}

Note I have mapped /metrics to return json or plain-text depending on the Accept Header in the request

When I make request at

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

I get expected response in json {"status":"WARN","id":2}.

However, when I try

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

I get HTTP/1.1 406 Not Acceptable.


EDIT

@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);
    }

}
like image 528
brain storm Avatar asked Sep 20 '25 13:09

brain storm


1 Answers

Just in case anyone still gets the Type mismatch: cannot convert from MediaType to String[] error:

The solution is to use MediaType.APPLICATION_JSON_VALUE

instead of MediaType.APPLICATION_JSON

Regards

like image 158
Camilo Avatar answered Sep 23 '25 11:09

Camilo