31.Spring和Dubbo中都有@Service注解,需要注意。
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Service;
32. Eclipse地方的注释换行了。
/**
* 校验令牌信息是否有效
*
* @param token
* 令牌信息
* @return 是否有效
*/
public boolean checkToken(String token) throws MemberSecurityException;
项目中需要改为:
/**
* 校验令牌信息是否有效
*
* @param token 令牌信息
* @return 是否有效
*/
public boolean checkToken(String token) throws MemberSecurityException;
修改模版,
Preference-Java-Code Style-Formatter-Edit-Comments-"New line after @Param tag"。
把自己的Formatter.xml文件导出,再导入,Ctrl+Shift+F,格式化就可以了。
33.SpringMVC,Fastjson,$ref.
最后的json存在$ref,前端js不好处理。(前端应该存在对应的js组件,可以解析这种$ref引用)
public static void main(String[] args) {
Member member = new Member();
member.setId(1L);
List<Member> memberList = new ArrayList<Member>();
memberList.add(member);
memberList.add(member);
System.out.println(JSON.toJSONString(memberList));
}
[{"id":1},{"$ref":"$[0]"}]
解决办法1:
public static void main(String[] args) {
Member member = new Member();
member.setId(1L);
List<Member> memberList = new ArrayList<Member>();
memberList.add(member);
memberList.add(member);
System.out.println(JSON.toJSONString(memberList,SerializerFeature.DisableCircularReferenceDetect));
}
输出:[{"id":1},{"id":1}]
解决办法2:
<bean id="jsonConverter"
class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes" value="application/json;charset=UTF-8"/>
<property name="features">
<array value-type="com.alibaba.fastjson.serializer.SerializerFeature">
<value>DisableCircularReferenceDetect</value>
</array>
</property>
</bean>
<bean id="DisableCircularReferenceDetect" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
<property name="staticField" value="com.alibaba.fastjson.serializer.SerializerFeature.DisableCircularReferenceDetect"></property>
</bean>
34.抛出异常,打印对应的“中文提示”。
super(codeEnum.getRemark());//这句话很关键,有了它,抛出异常的时候,可以直接看到“错误提示”
public enum MemberSecurityCodeEnum {
INVALID_ACCESS_TOKEN(13000,"不合法的AccessToken"),
ACCESS_TOKEN_EXPIRED(13001,"AccessToken已过期"),
}
public class MemberSecurityException extends Exception {
private Integer code;
private String msg;
public MemberSecurityException() {
super();
}
public MemberSecurityException(MemberSecurityCodeEnum codeEnum) {
super(codeEnum.getRemark());//这句话很关键,有了它,抛出异常的时候,可以直接看到“错误提示”
this.code = codeEnum.getCode();
this.msg = codeEnum.getRemark();
}
}
Exception in thread "main" exception.MemberSecurityException
#这种提示更直观
Exception in thread "main" exception.MemberSecurityException: AccessToken已过期
public static void main(String[] args) throws MemberSecurityException {
throw new MemberSecurityException(MemberSecurityCodeEnum.ACCESS_TOKEN_EXPIRED);
}
35.修改表字段的sql语句。
alter table order_item
change column productJson specJson text;
36.SpringMVC属性读取和容器,父子关系。
友情提示:父子关系理论应该是正确的,但不同配置文件之间的“父子关系”有待考验。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring-context.xml
</param-value>
</context-param>
这个是“顶级容器”,spring-mvc-servlet.xml是子容器。
猜测:web.xml先读取的是context上下文文件,另外MVC映射也是“可选的”。重要性方面,context更重要!
另外一种场景,
spring-context.xml
<import resource="classpath:spring-bean-service.xml" />
<import resource="classpath:spring-task.xml" />
疑问:spring-task.xml和spring-bean-service.xml之间的关系是?
猜测:平级,应该可以读取的到。他们都被导入到spring-context.xml中了。
扫描配置文件
<util:properties id="domainConfig" location="classpath:goods-domain.properties" />
<context:property-placeholder properties-ref="domainConfig" ignore-unresolvable="true" />
domainName=http://a.com
${domainName},如果注入到Java类中的变量值仍然是"${domainName}",而非“http://a.com”,就说明失败了。
37.Cookie写入失败?Cookie只能用80端口吗?
Java程序写入Cookie,浏览器再请求时,一只没有把Cookie带过来。
代码是从之前的项目中copy过来的,质量是很有保障的。
最终比较怀疑是,Cookie只能使用80端口,后来用了80端口,也还是不行。
然后又怀疑是,SpringMVC的ResponseBody有影响。
之前的代码是,手动调用Response.write发送字符串响应Web前端,然后跳转的。
//@ResponseBody
@RequestMapping(value = "/doLogin")
public void doLogin(String loginName, String password,
尝试了很多种方案,最后才开始考虑是配置问题,因为代码都是一样的。
正解:
p2p.domain=.p2p.jtn.com
#p2p.static=http://p2p.jtn.com:80/static
loginDomain=http://login.p2p.jtn.com:80
frontDomain=http://p2p.jtn.com:80
错解:
frontDomain=http://dev.jtn.com:8080
直接使用带了“http://"前缀的frontDomain
解决办法:
cookieDomain=.dev.jtn.com
frontDomain=http://dev.jtn.com:8080
cookieDomain用这个名字,看着更加直观,不会再错啦!!!(*^__^*)
经验:论变量名称的重要性!!!
38.注册的时候,一个人注册了多次。
51 1897132630 3d4f2bf07dc1be38b20cd6e46949a1071f9d0e3d 0 0 2016-06-15 17:14:53 2016-06-15 17:14:53 0
52 1897132630 3d4f2bf07dc1be38b20cd6e46949a1071f9d0e3d 0 0 2016-06-15 17:14:54 2016-06-15 17:14:54 0
数据库的手机号,没有加“唯一约束”。
使用zookeeper锁显然是不合适的,2个不同人,是可以同时注册的。
最简单的办法,只能是数据库添加“唯一约束”了。
39.Dubbo有警告warn。
please config: dubbo.registry.file=xxx.properties。
java.io.IOException: Can not lock the registry cache file C:UsersAdministrator.dubbodubbo-registry-224.5.6.110.cache, ignore and retry later, maybe multi java process use the file, please config: dubbo.registry.file=xxx.properties
at com.alibaba.dubbo.registry.support.AbstractRegistry.doSaveProperties(AbstractRegistry.java:193)
at com.alibaba.dubbo.registry.support.AbstractRegistry$SaveProperties.run(AbstractRegistry.java:150)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
按照提示,配置了dubbo.registry.file=xxx.properties,还是不行。
可能的解决办法:zookepper缓存,清除或者重启就好。
40.JS换行符和在JS中整段地写HTML。
在2013年或者2014年,之前的问题总结中,遇到过这个问题。
当时,没有搞成功。
今天,又遇到了这个问题,成功了。
之前的
var str = '' +
'<!doctype html>' +
'<html>' +
' <body>' +
' <h1>❤ unicorns</h1>' +
' </body>' +
'</html>' +
'';
现在的
var str = '
<!doctype html>
<html>
<body>
<h1>❤ unicorns</h1>
</body>
</html>';
注意:不能使用Windows的换行符,"" 必须在最后;
使用网上的某些JS插件,还可以这么写:
var str = multiline(function(){/*
<!doctype html>
<html>
<body>
<h1>❤ unicorns</h1>
</body>
</html>
*/});
原理:
1. 在一个function中写上一段多行注释
2. 将此function toString()
3. 将多行注释内容用正则匹配出来
参考资料:http://ourjs.com/detail/53c8826a7a0187d41d000003
http://www.jb51.net/article/49480.htm