我正在学习Spring 3,我在一个简单的Web应用程序中使用它.
现在我正在使用注释实现Spring MVC Controller,我想知道:有没有使用@RequestMapping注释的最佳实践?
我的意思是:我已经看到通常在这个注释中映射的URL在类中是硬编码的...
有没有办法以"松散耦合的方式"传递URL(以获得更可重用的类)?
我知道有一些可以使用的外卡,但我认为这不是解决方案......我错了吗?
编辑:
我举一个例子来更好地解释我的怀疑.
假设我希望我的控制器由请求触发/foo/bar/baz/mypage.htm,在我的控制器中,处理程序方法将被注释@RequestMapping("/foo/bar/baz/mypage").
现在我决定更改触发我的控制器的URL /foo/bar/otherpage.htm,所以我需要编辑我的类,添加@RequestMapping("/foo/bar/otherpage")我的处理程序方法,重新编译项目并再次部署它.
在我看来不太实际......
我在我的项目中使用了Guava TypeToken类,但是我得到了意想不到的结果.
我有MyGenericClass<T>:
public class MyGenericClass<T> implements MyInterface {
private TypeToken<T> recordType;
public MyGenericClass(String name) {
this.recordType = new TypeToken<T>(getClass()) {};
// ...
}
// ...
@SuppressWarnings("unchecked")
protected Class<T> getRecordType() {
return (Class<T>) recordType.getRawType();
}
}
Run Code Online (Sandbox Code Playgroud)
因此,如果我实例化一个对象new MyGenericClass<String>(),然后调用getRecordType()我希望得到java.lang.String,而不是我得到java.lang.Object.
但是,如果我扩展泛型类:
public class MyStringImpl extends MyGenericClass<String> {
// ...
}
Run Code Online (Sandbox Code Playgroud)
并实例化这个新类:new MyStringImpl()然后我得到正确的结果.
为什么会这样?这是预期的行为TypeToken吗?
我正在开发一个Spring Boot(v1.3.3.RELEASE)项目.包含的Tomcat Embedded版本是8.0.32.
我收到这个错误:
2016-08-01 14:51:23.354 ERROR 6704 --- [ost-startStop-1] o.a.catalina.session.StandardManager : Exception loading sessions from persistent storage
java.io.EOFException: null
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2335)
...
Run Code Online (Sandbox Code Playgroud)
我在这个问题上读到了同样的错误:从持久存储加载会话异常,但我无法找到解决问题的方法.
我尝试应用aswers中建议的解决方案,但在我的情况下,我找不到"清理Tomcat工作目录"的方法或只是为了清理我的应用程序部署.
我怎么解决这个问题?在哪里可以找到Tomcat Embedded版本的工作文件夹?
注意我使用Eclipse作为IDE
在我的 Spring MVC 控制器中,我有一个这样的方法:
public String myMethod(@RequestParam(defaultValue="0") int param) { ... }
Run Code Online (Sandbox Code Playgroud)
当我传递一个字符串作为我的值时,我param显然得到了一个NumberFormatException:
无法将“java.lang.String”类型的值转换为所需的“int”类型;嵌套异常是 java.lang.NumberFormatException: For input string: "test"
这很清楚...
所以我试图找到一种方法,在发生此错误时将用户重定向到默认页面。有没有通用的方法来实现这一目标?
目前我正在考虑使用 aString代替 anint来映射 my param,检查这是否可以解析int,然后切换到适当的逻辑,但这似乎是一种解决方法,而不是解决方案......
有没有更优雅的方法来处理这个问题并为 my 保持正确的类型绑定param?
我有一段这样的代码:
return getObject()
.map(obj -> obj.getNullableField())
.orElseThrow(() -> new IllegalStateException("Object not found!"));
Run Code Online (Sandbox Code Playgroud)
目前,当给定Object的不存在时,我会抛出异常.
现在我还需要检查nullableField的Object存在.
一个明显的解决方案可能是这样的:
var fieldVal = getObject()
.map(obj -> obj.getNullableField())
.orElseThrow(() -> new IllegalStateException("Object not found!"));
return Optional.ofNullable(fieldVal)
.orElseThrow(() -> new IllegalStateException("Field is not present"));
Run Code Online (Sandbox Code Playgroud)
但是我想在同一个功能链中实现它......
我错过了什么?
我正在尝试使用Spring验证来验证由Jackson转换器填充的模型.所以我有一个java类,
class MyClass(){
private String myString;
}
Run Code Online (Sandbox Code Playgroud)
这个类由Jackson填充,我在我的Java代码中有实例.还定义了一个验证器类,
class MyValidator implements Validator {
public boolean supports(Class<?> clazz) {
return MyClass.class.equals(clazz);
}
public void validate(Object object, Errors errors) {
//Validation logic here
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想做的是将对象发送到验证器并获取错误对象,检查并继续进行.但是,为了打电话
validate(Object object,Errors errors)
Run Code Online (Sandbox Code Playgroud)
我需要一个我没有的错误实例.我不能用BindingResult或Errors.请告知如何继续进行.
我有一个Decimal值表示一个时间间隔内的小时数.
现在我需要将此值加总为a TimeSpan,但我找不到有效的方法来执行此操作.
我现在的解决方案是做这样的事情:
myTimeSpan + new TimeSpan(0, 0, Math.Abs(decimalHours * 3600))
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来解决我的问题?
我来自Java编程并切换到C#编程我发现了LINQ的极端强大功能.
在我最近的实现中,我注意到我经常在我的代码中使用它(特别是LINQ to Objects)来避免foreach循环,搜索列表中的元素以及类似的任务.
现在我想知道在大量使用Linq to Objects时是否存在一些性能劣势......
我有一个使用Spring开发的简单Web应用程序,最近我在数据库连接方面遇到了一些问题。我的数据库在MS SQL Server 2005上。
为了检索数据,我使用框架提供的JDBCTemplate类实现了几个DAO。
有时我会遇到以下异常:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DataAccessResourceFailureException: StatementCallback; SQL [SELECT [Campaigns].[CampaignID],[CampaignCode],[CampaignType],[StartDate],[EndDate],[Status],[FirstUpdate],[LastUpdate],[FirstUpdateUserID],[LastUpdateUserID],[CampaignDescriptions].[Description] FROM [Campaigns] INNER JOIN [CampaignDescriptions] ON [Campaigns].[CampaignID] = [CampaignDescriptions].[CampaignID] ORDER BY [StartDate] DESC]; Connection reset by peer: socket write error; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset by peer: socket write error
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
Run Code Online (Sandbox Code Playgroud)
该异常似乎仅在执行报告的查询时才会发生。
我不明白是什么导致了这个问题。任何的想法?
执行查询的方法是:
@Transactional(propagation = Propagation.NEVER)
public Campaign[] getAll() {
List<Campaign> campList = getJdbcTemplate()
.query(BASE_QUERY,
new CampaignMapper());
return campList.toArray(new Campaign[0]);
}
Run Code Online (Sandbox Code Playgroud)
其中BASE_QUERY是在异常消息是相同的。
我在我的 Web 应用程序中使用 Spring Boot 缓存支持,并将Caffeine设置为缓存提供程序。
我的项目中有几个缓存,大多数都有通用的配置,但是对于两个特定的缓存我需要设置不同的参数。
在我的application.properties我有类似的东西:
spring.cache.cache-names=a-cache,b-cache,c-cache, ...
spring.cache.caffeine.spec=maximumSize=200,expireAfterWrite=3600s
Run Code Online (Sandbox Code Playgroud)
这适用于常见的缓存。然后我想用自定义参数扩展这个配置。
这篇文章解释了如何通过@Configuration类配置缓存,但使用这种方法我完全覆盖了通用配置。
我需要的是这样的:
@Configuration
public class CacheConfiguration {
@Autowired
private CacheManager cacheManager;
@Bean
public CacheManager cacheManager(Ticker ticker) {
CaffeineCache c1 = new CaffeineCache("my-custom-cache", Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
.maximumSize(400)
.build());
// ...
cacheManager.setCaches(Arrays.asList(..., c1, ... )); // here I'd like to add custom caches...
return cacheManager;
}
}
Run Code Online (Sandbox Code Playgroud)
但是声明一个新的CacheManagerbean,“原始”cacheManager不是自动装配的......
有没有办法实现我需要的?
java ×8
spring ×5
spring-mvc ×4
.net ×2
c# ×2
spring-boot ×2
.net-3.5 ×1
annotations ×1
caffeine ×1
generics ×1
guava ×1
jackson ×1
jdbc ×1
jdbctemplate ×1
linq ×1
optional ×1
performance ×1
timespan ×1
tomcat ×1
validation ×1