2014-12-08 178 views
1

我想接受並響應REST應用程序中的JSON對象。我需要發送和接收的數據位於.properties文件中。我已經閱讀過它們,現在處於Properties對象(從java.util.Properties)。有沒有一種方法來編組和解組Properties對象,而不實施一個新的類?如何使用JAXB將屬性對象轉換爲JSON對象

我在Weblogic服務器中使用Jax-rs API。

@POST 
@Path("{id}") 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public JSONObject getbyID(@PathParam("id")JSONObject inputJsonObj) { 
    //marshalling and unmarshalling goes here 
} 
+0

是否有您正在使用的特定REST框架? – 2014-12-08 08:52:21

+0

我在weblogic服務器中使用JAX-RS。默認提供者是weblogic中的Jersey。 – Shenal 2014-12-08 08:54:56

+0

你爲什麼通過路徑發送jsonobject?爲什麼不通過形式? – 2014-12-08 09:08:22

回答

2

不太熟悉的WebLogic,所以我不知道是什麼版本的澤西它使用(1 x或2.X),但與1.x中,你可以簡單地添加這種依賴

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-json</artifactId> 
    <version>${jersey-version}</version> 
</dependency> 

這將取決於傑克遜。 Jackson已經反序列化並將Properties對象序列化爲JSON對象。

這裏有一個簡單的測試

資源

@Path("/properties") 
public class PropertiesResource { 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response getProperties() throws Exception { 
     FileInputStream fis = new FileInputStream("test.properties"); 
     Properties props = new Properties(); 
     props.load(fis); 
     return Response.ok(props).build(); 
    } 

    @POST 
    @Consumes(MediaType.APPLICATION_JSON) 
    public Response postProperties(Properties properties) { 
     StringBuilder builder = new StringBuilder(); 
     for (String key: properties.stringPropertyNames()) { 
      builder.append(key).append("=") 
        .append(properties.getProperty(key)).append("\n"); 
     } 
     return Response.created(null).entity(builder.toString()).build(); 
    } 
} 

測試

public void testMyResource() throws Exception { 
    ClientConfig config = new DefaultClientConfig(); 
    config.getClasses().add(JacksonJsonProvider.class); 
    config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, 
                 Boolean.TRUE); 

    Client c = Client.create(config); 

    WebResource resource = c.resource(Main.BASE_URI).path("properties"); 
    String json = resource.accept("application/json").get(String.class); 
    System.out.println(json); 

    FileInputStream fis = new FileInputStream("test.properties"); 
    Properties props = new Properties(); 
    props.load(fis); 
    String postResponse 
      = resource.type("application/json").post(String.class, props); 
    System.out.println(postResponse); 
} 

結果:

// from get 
{"prop3":"value3","prop2":"value2","prop1":"value1"} 

// from post 
prop3=value3 
prop2=value2 
prop1=value1 

對於配置,你只需要配置POJOMappin摹功能並註冊傑克遜提供商

綱領性

public class JerseyApplication extends ResourceConfig { 
    public JerseyApplication() { 
     packages(...); 
     getProviderClasses().add(JacksonJsonProvider.class); 
     getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); 
    } 
} 

的web.xml

<init-param> 
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
    <param-value>true</param-value> 
</init-param> 

隨着新澤西2.X,這是一個有點簡單。我們只需要此提供

<dependency> 
    <groupId>com.fasterxml.jackson.jaxrs</groupId> 
    <artifactId>jackson-jaxrs-json-provider</artifactId> 
    <version>2.4.0</version> 
</dependency> 

和註冊同一JacksonJaxbJsonProvider(雖然不同的包,類名是相同的)。無需Pojo映射功能。


注:在這兩種情況下,有兩種傑克遜提供商,一個JacksonJsonProviderJacksonJaxbJsonProvider。如果您希望pojos的編組依賴於JAXB註釋,那麼您應該註冊後者。

+1

在weblogic 12c中支持Jersey 2.x – Shenal 2014-12-08 10:02:56