gpt4 book ai didi

java - 在 Spring 中使用构建器模式作为 Rest api

转载 作者:太空宇宙 更新时间:2023-11-04 11:00:47 25 4
gpt4 key购买 nike

我正在 Spring Boot 中创建 REST API,我需要有关在 Spring 中使用构建器模式的最佳方法的建议,因为我是 Spring 新手。

Product.java(数据库实体)

public class Product{
private String name;
private String sku;

//getter-setter
}

ProductBuilder.java

public interface ProductBuilder {
public ProductBuilder setBasicDetails(String name, String sku)
}

ProductBuilderImpl.java

public class ProductBuilderImpl implements ProductBuilder{

// issue is with creating new object of `Product`

@Override
public ProductBuilder setBasicDetails(String name, String sku) {
product.setName(name);
product.setSku(sku);
return this;
}
}

建议通过以下方法为多个 HTTPRequest 创建新的 Product 对象。

<小时/>

方法 1:@Autowired ProductBuilder。

@Service
public class xyzServiceImpl implements xyzService{

@Autowired
private ProductBuilder productBuilder;

// business logic
}

xyzServiceImpl 是单例,因此 ProductBuilder 将仅创建一个 Product 对象,并在 Thread/Request 之间共享该对象

HTTP 请求 1:使用 id = null 初始化 Product > 执行保存 > id = 123

HTTP 请求 2:在 HTTP 请求 1 中更新了对象[Product.id = 123],但我每次都想要新对象

所以我尝试了以下解决方案但不起作用

@Configuration
public class ModelBuilderConfiguration {

@Bean
@Scope(value = "prototype")
public ProductBuilder productBuilder(){
return new ProductBuilderImpl();
}
}

并在ProductBuilderImpl中创建initMethod来创建新对象。

@Configuration
public class ModelBuilderConfiguration {

@Bean(initMethod = "initMethod")
@Scope(value = "prototype")
public ProductBuilder productBuilder(){
return new ProductBuilderImpl();
}
}

我使用了@Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)但这也不起作用。

使用ThreadLocal可以与@Autowired一起使用,但推荐吗?

public class ProductBuilderImpl implements ProductBuilder{

private ThreadLocal<Product> product = new ThreadLocal<Product>(){
@Override
protected Product initialValue() {
return new Product();
}
};

@Override
public ProductBuilder setBasicDetails(String name, String sku) {
product.get().setName(name);
product.get().setSku(sku);
return this;
}
}

方法 2:在构造函数中创建新对象。

public class ProductBuilderImpl implements ProductBuilder{

private Product product;

public ProductBuilderImpl() {
product = new Product();
}

@Override
public ProductBuilder setBasicDetails(String name, String sku) {
product.setName(name);
product.setSku(sku);
return this;
}
}

并在 xyzServiceImpl 中使用它,例如 ProductBuilder ProductBuilder = new ProductBuilderImpl();,这样我每次都会获得新对象。

那么考虑到 Spring 哪种方法是最好的?或者建议更好的初始化 Product 对象的方法。

最佳答案

如果每次发出请求时都想要一个新的 Product 对象,那么您可以依靠 Spring 进行初始化并忘记构建器的事情。只需将其设置为托管 bean 并设置其请求范围即可。你可以这样做:

@ManagedBean // or @Component
@RequestScope // or @Scope("request")
public class Product {
...
}

并将其注入(inject)到您的服务中。

@Service
public class XyzServiceImpl implements XyzService{

private final Product product;

// A proxy is injected, not the actual object.
@Inject // or @Autowired or none
public XyzServiceImpl(Product product) {
this.product = product;
}

}

关于java - 在 Spring 中使用构建器模式作为 Rest api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46925058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com