2016-01-14 56 views
0

我有一個序列化spring管理bean的問題。spring序列化自動編寫的字段

我想返回自動連接bean作爲一個restcontroller的響應。我讀過幾個回覆,其中一個建議使用simpleFilter。(Use SimpleFilter to exclude non required fields.)。不過,我不認爲這個建議是很實際的,而且我相信有更簡單更具體的解決問題的方法。

我有一個春天的託管bean稱爲JobStatus。

@Component 
@Scope(value="Prototype") 
public class JobStatus{ 

    private Integer job_type; 

    public Integer getJob_type() { 
     return job_type; 
    } 

    public void setJob_type(Integer job_type) { 
     this.job_type = job_type; 
    } 


    public JobStatus(){ 

    } 
} 

我有一個控制器如下:

@RestController 
public class JobController { 

@Autowired 
JobStatus js; 

@RequestMapping(value = "/get_job_status", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) 
public @ResponseBody 
JobStatus get_job_status(@RequestBody JobStatusRequest req) { 


    js.setJobType(req.getJobType); 


    ObjectMapper mapper = new ObjectMapper(); 

    try { 
     System.out.println(mapper.writeValueAsString(js)); 
    } catch (JsonProcessingException e) { 

     e.printStackTrace(); 
    } 



    return js; 

} 

} 

它拋出以下異常:

com.fasterxml.jackson.databind.JsonMappingException:沒有串行發現類org.springframework。 cglib.proxy.NoOp $ 1和沒有屬性發現(以避免異常,禁用SerializationFeature.FAIL_ON_EMPTY_BEANS))(通過引用鏈來創建BeanSerializer:ATM.Job.JobStatus $$ EnhancerBySpringCGLIB $$ be675215 [ 「回調」])

我已經嘗試將JobStatus的範圍更改爲「單例」和「會話」和「請求」,它沒有任何區別。 我們應該如何序列化「代理」?

回答

1

創建一個視圖類

public class JobStatusView { 

    public JobStatusView(JobStatus js) { 
     job_type = js.getJob_type(); 
    } 

    private Integer job_type; 

    public Integer getJob_type() { 
     return job_type; 
    } 

    public void setJob_type(Integer job_type) { 
     this.job_type = job_type; 
    } 
} 

讓你的控制器方法的返回new JobStatusView(js)或創建創建實例是一個工廠類或任何你的首選方法。

這具有從視圖中分離數據的益處。稍後,如果需要,您可以在視圖類中添加任何傑克遜註釋,而無需將它們堆疊到原始bean中。

+1

,可以用[塞爾瑪](http://www.selma-java.org/)或[推土機](http://dozer.sourceforge.net/documentation/usage.html)來自動化之間的映射數據和查看pojo – Quentin

+0

這不回答我的問題。您只需創建另一個不受Spring管理的類即可繞過它。我的問題是關於自動佈線bean的序列化。謝謝。 – user2076066

0

我不知道這是否會工作,但它在其他方面爲我工作。 您可以嘗試在Jobstatus類上使用@Configurable(配置AspectJ編織)並在控制器中創建新的作業狀態實例。每當調用JObStatus的新實例時,Spring就會注入bean。然後您可以照常序列化jobstatus對象。