我认为就REST而言,ID应该放在URL中,例如:
https://example.com/module/[ID]
然后我在该URL上调用GET,PUT,DELETE.我觉得这很清楚.在Spring MVC控制器中,我将获得@PathVariable的ID.作品.
现在,我对Spring MVC的实际问题是,如果我这样做,我不得不将ID作为表单的一部分包含(同样),Spring会发出类型警告
Skipping URI variable 'id' since the request contains a bind value with the same name.
Run Code Online (Sandbox Code Playgroud)
除此以外.只发送一次也是有道理的,对吧?如果他们不匹配你会怎么做?
那没关系,但我的表格支持bean有一个自定义验证器,需要知道ID!(它需要检查某个唯一名称是否已用于不同的实体实例,但不能在不知道提交的表单的ID的情况下).
我没有找到一个很好的方法告诉验证器来自@PathVariable的ID,因为即使在我的控制器方法中的代码执行之前验证也会发生.
你会如何解决这个困境?
这是我的控制器(已修改):
@Controller
@RequestMapping("/channels")
@RoleRestricted(resource = RoleResource.CHANNEL_ADMIN)
public class ChannelAdminController
{
protected ChannelService channelService;
protected ChannelEditFormValidator formValidator;
@Autowired
public ChannelAdminController(ChannelService channelService, ChannelEditFormValidator formValidator)
{
this.channelService = channelService;
this.formValidator = formValidator;
}
@RequestMapping(value = "/{channelId}/admin", method = RequestMethod.GET)
public String editChannel(@PathVariable Long channelId, @ModelAttribute("channelForm") ChannelEditForm channelEditForm, Model model)
{
if (channelId > 0)
{
// Populate from …Run Code Online (Sandbox Code Playgroud) 我想使用Spring MVC构建一个简单的文件上传功能.
我有multipartResolver到位并正在工作:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10240000"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
上传文件时会记录下来:
DEBUG:[org.springframework.web.multipart.commons.CommonsMultipartResolver]: Found multipart file [imageUpload] of size 29081 bytes with original filename [xyz.jpg], stored at [/home/myuser/workspace/myProject/target/tmp/upload_67f1107c_1b8f_402c_bebd_6cd8a6e4c830_00000032.tmp]
Run Code Online (Sandbox Code Playgroud)
这告诉我它基本上是有效的.
这是我的JSP的一部分:
<form:form modelAttribute="placeForm" action="/platz/save" method="post" cssClass="placeForm" enctype="multipart/form-data">
...
<label for="imageUpload">Upload</label>
<form:input type="file" path="imageUpload" id="imageUpload" accept="image/*" />
...
</form:form>
Run Code Online (Sandbox Code Playgroud)
这是我的模型属性对象的类:
public class PlaceEditForm
{
@Valid
private Place place = new Place();
private Map<Integer, PlaceFeature> features;
private MultipartFile imageUpload;
... getter/setter omitted...
}
Run Code Online (Sandbox Code Playgroud)
这是我的Controller方法的一部分:
@RequestMapping(value="/save", method=RequestMethod.POST)
public String savePlace (@Valid @ModelAttribute("placeForm") PlaceEditForm form, BindingResult …Run Code Online (Sandbox Code Playgroud) 我刚读这篇文章:
http://www.tutorialized.com/view/tutorial/Spring-MVC-Application-Architecture/11986
我觉得很棒.它很好地解释了层结构,我很高兴我正在使用的架构就是他所描述的.
但有一件事,我似乎没有得到:
第一:业务逻辑到底是什么?它不是什么?在他所说的文章中(并且他不是唯一的),业务逻辑应该进入域模型.所以一个Account类应该有一个activate()知道如何激活一个的方法Account.根据我的理解,这可能涉及一些持久性工作.但域模型不应该具有DAO的依赖性.只有服务层应该知道DAO.
那么,业务逻辑是域实体可以自己做什么的呢?就像activate()方法将active属性true设置dateActivated为new Date(),再将属性设置为,然后它是服务的第一次调用account.activate()和第二次调用的任务dao.saveAccount(account)?什么需要外部依赖关系到服务?这就是我到目前为止所做的事情.
public AccountServiceImpl implements AccountService
{
private AccountDAO dao;
private MailSender mailSender;
public void activateAccount(Account account)
{
account.setActive(true);
account.setDateActivated(new Date());
dao.saveAccount(account);
sendActivationEmail(account);
}
private void sendActivationEmail(Account account)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
这跟他说的相反,我想,不是吗?
我还没有得到的是关于如何使用Spring线域对象的示例Account.如果账户自己发送电子邮件,则需要哪些.
鉴于此代码:
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
public class Account {
private String email;
private MailSender mailSender;
private boolean active = …Run Code Online (Sandbox Code Playgroud) java spring dependency-injection business-logic business-objects
我是Spring Framework的新手.我们想在Web应用程序中引入它(3.1),目前使用Web层中的struts,业务层中的服务外观和业务对象以及持久层中自编写的JDBC DAO(所有这些都紧密耦合!)
我创建了几个.xml配置,一个用于servlet配置,仅扫描com.mydomain.web包.另一个在服务层appContext-service.xml上扫描com.mydomain.bs和.bo包,另一个用于DAO层appContext-persistence.xml扫描.dao包.
我们有四个具有适当项目依赖性的Eclipse项目:Web,Business,Common(包含域对象,DTO,Exceptions等),DataAccess.
我想在可能的情况下使用注释,并且已经创建了一个MVC控制器,一个带接口的新服务和一个带接口的新dao,使用JDBC模板,这一切都很有效.
现在我的问题是:
我们不能一次重写所有代码,我们在这里谈论更大的代码库.但是,如果还需要从尚未知道Spring的服务和业务对象中获取新创建的服务,我该怎么办?它们不是bean,也不是Spring创建的.我怎么能抓住我的服务bean?
我们有几个独立的应用程序用于批处理,定期清理文件系统和数据库表等.它们由cron(UNIX cron)触发,因此有自己的JVM.考虑到不同的.xml配置,我最好如何在这里使用Spring服务?
我的设置是否有任何意义?
感谢您的任何见解.
我是Spring的新手,我对它提供的所有东西感到非常兴奋!
现在,我正在尝试在现有项目中对几个DAO进行现代化.具体来说,我想用Spring Jdbc支持替换旧的纯JDBC代码,并介绍Spring的透明缓存.
第一个问题:我是否正确DAO层是添加@Cacheable注释的正确位置?或者你在业务层做到了吗?
我可以按照所有简单的例子在网上找到.但是,当涉及更多真实世界的代码时,我会陷入困境:
具体来说,我有几个方法返回我的模型的实例Publisher.在我的手动缓存实现中,我总是确保只为一个实例缓存并获取不同的getPublisher()方法.但是,使用@Cacheable并尝试在DAO中封装缓存,我遇到的问题是,注释不适用于本地方法调用(因为代理).
这是我的示例代码:
@Cacheable("publisherCache")
public Publisher getPublisher(int publisherId)
{
String sql = "SELECT * FROM publisher LEFT JOIN publisherContacts USING (publisherId) WHERE publisherId=? ORDER BY publisherContactId ASC";
return getJdbcTemplate().query(sql, publisherResultSetExtractor, publisherId);
}
public List<Publisher> findVisiblePublishers()
{
List<Publisher> publishers = new LinkedList<Publisher>();
for (int publisherId : findVisiblePublisherIds())
{
publishers.add(getPublisher(publisherId));
}
return publishers;
}
@Cacheable(value = "publisherCache", key = "'list'")
private List<Integer> findVisiblePublisherIds()
{
String sql = "SELECT …Run Code Online (Sandbox Code Playgroud) java ×5
spring ×5
spring-mvc ×3
annotations ×1
architecture ×1
caching ×1
ehcache ×1
file-upload ×1
rest ×1