Java @RequestBody请求是否有@PostConstruct等价物?

Java @RequestBody请求是否有@PostConstruct等价物?,java,spring-mvc,spring-3,postconstruct,Java,Spring Mvc,Spring 3,Postconstruct,我有一个类似于以下内容的Web服务: @RequestMapping(value = "/getMovies", method = RequestMethod.POST, produces = "application/json") public @ResponseBody ResponseVO getMoviesList(@RequestBody RequestVO vo) { .... } RequestVO类是: public class RequestVO { private Stri

我有一个类似于以下内容的Web服务:

@RequestMapping(value = "/getMovies", method = RequestMethod.POST, produces = "application/json")
public @ResponseBody ResponseVO getMoviesList(@RequestBody RequestVO vo) { .... }
RequestVO类是:

public class RequestVO {
private String[] genreList;

    public void updateRequest() {
        if (genreList != null) {
            // remove the duplicates from the list
            // or something else
        }
    }

    public String[] getGenreList() {
        return genreList;
    }

    public void setGenreList(String[] genreList) {
        this.genreList = genreList;
    }

}
现在,我希望在请求json作为RequestVO处理后自动调用updateRequest方法。我现在想到的一件事是@PostConstruct,但在这种情况下似乎没有用

我的问题是Spring是否提供了这样的注释或机制?或者@PostConstruct就可以了


注:我不需要变通办法,因为我有很多变通办法。因此,请克制自己不要发布它们。以上代码仅为示例,请忽略小错误

需要考虑的几点:

不要在Rest服务方法名称(如getMovies)中使用动词,因为您使用HTTP动词(如GET、POST等)指定操作。 POST应用于在服务器上创建资源,而不是检索方法名称所暗示的资源:“getMovies” 您希望实现的是在将RequestVO实例传递给getReportData之前调用RequestVO.updateRequest,对吗?如果是这样,您能详细说明一下,为什么不能在getReportData的开头调用此方法

如果您想实现这种功能,不管它是否合理,请尝试:

创建将在getReportData和调用updateRequest之前调用的新方面 如果您使用Jackson将JSON映射到Java对象,请使用@JsonFactory,如:

public class RequestVO {
private String[] genreList;

public void updateRequest() {
    if (genreList != null) {
        ...
    }
}

public String[] getGenreList() {
    return genreList;
}

public void setGenreList(String[] genreList) {
    this.genreList = genreList;
}

@JsonFactory
public static RequestVO createExample(@JsonProperty("genreList") final String[] genreList) {
    RequestVO request = new RequestVO(genreList);
    request.updateRequest();
    return request;
}
}

正如您所说,@PostConstruct只是在创建bean之后调用的,在这里没有任何用处。但是在另一个方法结束后调用一个方法有两种简单的方法

显式:只需将实际方法包装到另一个方法中,并在其中执行所有预处理或后处理

@RequestMapping(value = "/getMovies", method = RequestMethod.POST, produces = "application/json")
public @ResponseBody ResponseVO getMoviesList(@RequestBody RequestVO vo) {
    // pre_processing
    ResponseVO resul = doGetMoviesList(vo);
    // post_processing
    return resul;
}
public ResponseVO doGetMoviesList(RequestVO vo) { ... }
写起来很简单,即使不是很好

使用Spring AOP。您可以定义一个after returning通知,该通知将在adviced方法正常返回后调用。如果需要,建议可以在多个类之间共享,并相应地编写切入点。它确实功能强大,但有一个警告:Spring实现使用代理,默认情况下使用JDK代理。这意味着任何建议的方法都应该是接口的成员并通过该接口调用。因此,与控制器相比,为服务提供建议将更简单、更干净。IMHO,如果您真的需要在控制器上执行AOP,您应该使用完整的AspectJ,包括类编织。。。简而言之,它非常好,功能非常强大,但实现起来有点困难。
事实上,这就是我所说的显式解决方案!第二个似乎很有趣,但也超出了我的范围和理解。无论如何,谢谢。你可能没有看过我的NB部分。无论如何,谢谢你的会议提示。仅供参考getMovies使用Json,因此它是一篇文章。我在用Jackson,所以我可以试试你的解决方案,你能详细说明一下吗。createExample是否会在每次服务调用进入方法体之前被调用?嘿,我无法导入@JsonFactory注释。有指针吗?应该是@JsonCreator。还有一个问题,您是否尝试过获取方法并将流派列表作为请求参数/movie发送?id=1,2,3,然后您可以使用@RequestParam Set genresIt代替@RequestBody。这不是一个简单的电影列表应用程序,这只是一个示例。我别无选择,只能发布一个复杂的Json。