小编mar*_*2ch的帖子

我应该将我的实体的ID放在URL中还是作为隐藏字段放入表单中?

我认为就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)

java rest spring spring-mvc

19
推荐指数
2
解决办法
588
查看次数

Spring文件上传未绑定到模型属性对象

我想使用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)

java spring file-upload spring-mvc

13
推荐指数
1
解决办法
1万
查看次数

业务逻辑(以及那是什么?)应该在哪里实现,以及如何使用Spring实现这一目标?

我刚读这篇文章:

http://www.tutorialized.com/view/tutorial/Spring-MVC-Application-Architecture/11986

我觉得很棒.它很好地解释了层结构,我很高兴我正在使用的架构就是他所描述的.

但有一件事,我似乎没有得到:

第一:业务逻辑到底是什么?它不是什么?在他所说的文章中(并且他不是唯一的),业务逻辑应该进入域模型.所以一个Account类应该有一个activate()知道如何激活一个的方法Account.根据我的理解,这可能涉及一些持久性工作.但域模型不应该具有DAO的依赖性.只有服务层应该知道DAO.

那么,业务逻辑是域实体可以自己做什么的呢?就像activate()方法将active属性true设置dateActivatednew 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

7
推荐指数
1
解决办法
1万
查看次数

Spring:如何在Webapp和Standalone程序中获取Application上下文

我是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模板,这一切都很有效.

现在我的问题是:

  1. 我们不能一次重写所有代码,我们在这里谈论更大的代码库.但是,如果还需要从尚未知道Spring的服务和业务对象中获取新创建的服务,我该怎么办?它们不是bean,也不是Spring创建的.我怎么能抓住我的服务bean?

  2. 我们有几个独立的应用程序用于批处理,定期清理文件系统和数据库表等.它们由cron(UNIX cron)触发,因此有自己的JVM.考虑到不同的.xml配置,我最好如何在这里使用Spring服务?

  3. 我的设置是否有任何意义?

感谢您的任何见解.

java architecture spring spring-mvc

6
推荐指数
1
解决办法
3万
查看次数

使用@Cacheable注释的真实DAO的最佳实践

我是Spring的新手,我对它提供的所有东西感到非常兴奋!

现在,我正在尝试在现有项目中对几个DAO进行现代化.具体来说,我想用Spring Jdbc支持替换旧的纯JDBC代码,并介绍Spring的透明缓存.

  1. 第一个问题:我是否正确DAO层是添加@Cacheable注释的正确位置?或者你在业务层做到了吗?

  2. 我可以按照所有简单的例子在网上找到.但是,当涉及更多真实世界的代码时,我会陷入困境:

具体来说,我有几个方法返回我的模型的实例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 spring caching annotations ehcache

5
推荐指数
1
解决办法
925
查看次数