【问题标题】:Could not extract response: no suitable HttpMessageConverter with jaxb2marshaller无法提取响应:没有合适的 HttpMessageConverter 与 jaxb2marshaller
【发布时间】:2012-02-03 01:12:39
【问题描述】:

我在客户端和服务器上都设置了使用 Jaxb2 的 MarshallingMessageConverter

关注this问题。

这是在服务器端:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(marshallingMessageConverter());
    }

    public MarshallingHttpMessageConverter marshallingMessageConverter() {
        return new MarshallingHttpMessageConverter(jaxb2Marshaller(), jaxb2Marshaller());
    }

    public Jaxb2Marshaller jaxb2Marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setClassesToBeBound(new Class[]{
                User.class
            });
        return marshaller;
    }
}

客户端:

@Configuration
public class RESTConfig {

    @Bean
    public MarshallingHttpMessageConverter marshallingMessageConverter() {
        return new MarshallingHttpMessageConverter(jaxb2Marshaller(), jaxb2Marshaller());
    }

    @Bean
    public Jaxb2Marshaller jaxb2Marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setClassesToBeBound(new Class[] {
            User.class
        });
        return marshaller;
    }

    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>();
        //converters.addAll(restTemplate.getMessageConverters());

        converters.add(marshallingMessageConverter());
        restTemplate.setMessageConverters(converters);

        return restTemplate;
    }
}

检查两个日志:

org.springframework.oxm.jaxb.Jaxb2Marshaller createJaxbContextFromClasses
INFO: Creating JAXBContext with classes to be bound [class com.cloudlb.model.User]

当我尝试检索用户时。我得到了这个

org.springframework.web.client.RestClientException: 
Could not extract response: no suitable HttpMessageConverter found for response type [com.cloudlb.model.User] and content type [application/xml]

我错过了什么吗?

我通过将其检索为 String.class 进行检查,它工作正常。以 XML 文件格式返回。

我要实现XML XML Object>

User user = restTemplate.getForObject(url, User.class);

已编辑:这是我的控制器

@Controller
@RequestMapping("/user")
public class UserServiceController {

    @Autowired
    private UserService userService;

    public UserServiceController() {}

    @RequestMapping(value="/{id}", method = RequestMethod.GET)
    @ResponseBody
    public User findUserById(@PathVariable("id") String id) {
        return userService.findById(id);
    }
}

提前谢谢你。

【问题讨论】:

  • 您的 User 类是如何定义的 - 它有 @XmlRootElement 注释吗?
  • 是的,我有。看起来像这样@Entity @Table(name = "user") @XmlRootElement(name = "user") public class User implements Serializable { ... }
  • 我们能看到处理您请求的控制器吗?

标签: java xml spring spring-mvc configuration


【解决方案1】:

当我配置这个时,我定义了一个 ContentNegotiatingViewResolver 如下:

@Bean
public ContentNegotiatingViewResolver contentNegotiatingViewResolver() {
    ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();
    Map<String, String> mediaTypes = new HashMap<String, String>();
    mediaTypes.put("xml", "application/xml");
    resolver.setMediaTypes(mediaTypes);

    List<ViewResolver> viewResolvers = new ArrayList<ViewResolver>();
    viewResolvers.add(new BeanNameViewResolver());

    resolver.setViewResolvers(viewResolvers);

    return resolver;
}

然后我从我的控制器返回:

return new ModelAndView("spotView", "spot", spot);

然后在我的配置中,我定义了一个与控制器返回的视图同名的 bean(因为我使用的是 BeanName 解析器):

@Bean
public MarshallingView spotView() {
    return new MarshallingView(jaxbMarshaller());
}

【讨论】:

  • 如果我的控制器作为对象(用户)返回怎么办?这可以实现吗?
  • 您可以只返回一个传入您的用户的 ModelAndView。然后在我的示例中定义一个名为 userView 的 bean。
  • 收到 406 HTTP 错误。我发现我忘记在客户端的用户域对象中将@XmlRootElement 作为@Grzegorz Grzybez 提到。我只放在服务器端
猜你喜欢
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 2018-08-18
  • 1970-01-01
  • 2014-09-28
  • 2017-10-25
  • 2017-09-06
  • 1970-01-01
相关资源
最近更新 更多