2012-01-05 6 views
2

IセットアップとHttpMessageConverter全く適しはthis質問からJAXB2は、応答を抽出できませんでした:クライアントとサーバーの両方でjaxb2marshaller

フォローを使用してMarshallingMessageConverterを持っていないし。

これはサーバー側にあります:

@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 < - - 私は< --http XMLを達成したい

>オブジェクト>

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

は、事前にありがとうございます。

+0

ユーザークラスが定義されています - @ XmlRootElement注釈はありますか? –

+0

はい、あります。これは、{...} ' – xyzxyz442

+0

は、我々はあなたのコントローラを見ることができます処理するこの ' @Entity @Table(名= "ユーザー") @XmlRootElement(名= "ユーザー") パブリッククラスユーザーがSerializableを実装のように見えるあなたの要求? –

答えて

1

私はこれを設定すると、私は次のようにContentNegotiatingViewResolver定義:

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

をして、私の設定では、私は同じ名前のBeanを定義した:

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

、その後、私のコントローラからのIが返さ(私はBeanNameリゾルバを使用しているため)コントローラからビューが返されます。

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

コントローラがオブジェクト(ユーザー)として返却される場合はどうなりますか?これは達成できるのでしょうか? – xyzxyz442

+0

あなたのUserに渡すModelAndViewを返すことができます。私の例のように、userViewというbeanを定義します。 –

+1

HTTPエラーが発生しました。私は@Grzegorz Grzybezがクライアント側のユーザドメインオブジェクトに '@XmlRootElement'を記述するのを忘れていることを理解しています。私はサーバー側だけに置く – xyzxyz442

関連する問題