Hi,
We are doing porting our REST service from Wink0.1 to Wink1.0.
we met the issue that the default "Media type Mapping" setting didn't work any
longer in Wink 1.0.
In Wink 0.1 it supports access a certain atom entry by Browser like IE, and it
changes the "Content-Type" to "text/xml" in response automatically.
And this makes browser can display atom entry xml file correctly, by default
setting in Wink 0.1.
But in Wink 1.0 it doesn't work, so I followed "Apache wink 1.0 user guide",
the chapter 5.5 "Spring Integration" Customizing Media-Type Mappings said:
<bean id="custom.MediaTypeMapper"
class="org.apache.wink.server.internal.MediaTypeMapper">
<property name="mappings">
<list>
<map>
<entry key="userAgentStartsWith" value="Mozilla/" />
<entry key="resultMediaType">
<util:constant static-field=" javax.ws.rs.core.MediaType.ATOM" />
</entry>
<entry key="typeToSend">
<util:constant static-field="javax.ws.rs.core.MediaType.TEXT_XML" />
</entry>
</map>
</list>
</property>
</bean>
Actually, this is wrong, because These is no field named
javax.ws.rs.core.MediaType.ATOM in MediaType and the
org.apache.wink.server.internal.MediaTypeMapper doesn't have a public property
named "mappings", so it doesn't work.
Then I followed wink Api doc, I created a subclass to extend
"org.apache.wink.server.handlers.MediaTypeMapperFactory",
But it still didn't work either I set it in Wink config file like this :
wink.mediaTypeMapperFactoryClass=com.hp.sm.dao.wink.CustomizedMediaTypeMapper
or set it by Spring like this:
<bean id="custom.MediaTypeMapper"
class="com.hp.sm.dao.wink.CustomizedMediaTypeMapper">
<bean id="customConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreUnresolvablePlaceholders"
value="true" />
<property name="order" value="1" />
<property name="propertiesArray">
<list>
<props>
<prop key="wink.MediaTypeMapper">custom.MediaTypeMapper</prop>
<prop key="wink.propertiesFactory">customPropertiesFactory</prop>
</props>
</list>
</property>
</bean>
Do you know how to enable this "Media type Mapping" correctly? Attached my
CustomizedMediaTypeMapper content. Log shows the method getMediaTypeMappings()
never be called.
11:public class CustomizedMediaTypeMapper extends MediaTypeMapperFactory{
12: private static Logger log =
Logger.getLogger(CustomizedMediaTypeMapper.class.getName());
13: private List<MappingRecord> records;
14: public CustomizedMediaTypeMapper(){
15: log.info("CustomizedMediaTypeMapper is created");
16: records = new ArrayList();
17: records.add(new MappingRecord());
18: }
19:
20: public List<? extends MediaTypeMappingRecord> getMediaTypeMappings(){
21: log.info("in getMediaTypeMappings()");
22: return records;
23: }
24:
25: private static class MappingRecord implements MediaTypeMappingRecord{
26: public MediaType match(HttpHeaders requestHeaders,MediaType
responseMediaType){
27: List<String> header =
requestHeaders.getRequestHeader(requestHeaders.USER_AGENT);
28: if(log.isLoggable(Level.INFO))
29: log.info("response media type =
"+responseMediaType.getSubtype());
30: boolean isAtom = responseMediaType.getSubtype().contains("atom");
31: if(!isAtom)
32: return responseMediaType;
33: for(String h:header){
34: if(log.isLoggable(Level.FINE))
35: log.fine("header:"+h);
36: if(h.contains("Mozilla") && isAtom){
37: return MediaType.TEXT_XML_TYPE;
38: }
39: }
40: return responseMediaType;
41: }
42: }
43:}
Regards,
Caron